मैं एक XML फ़ाइल है कि एक directed acyclic graph (DAG) कि एक partial order का प्रतिनिधित्व करता है encodes की है। ऐसे ग्राफ निर्भरताओं को निर्दिष्ट करने और critical paths खोजने जैसी चीजों के लिए उपयोगी हैं। जिज्ञासु के लिए, मेरे वर्तमान आवेदन तो कोने घटकों और किनारों संकलन समय निर्भरता निर्दिष्ट कर रहे हैं, एक build system के लिए घटक निर्भरता निर्दिष्ट करने के लिए है। यहाँ एक सरल उदाहरण है:ढूँढना निर्देशित अचक्रीय ग्राफ़ (DAG) मिनिमल तत्वों (कोने) XSLT/XPath के साथ?
<?xml version="1.0"?>
<dag>
<vertex name="A">
<directed-edge-to vertex="C"/>
</vertex>
<vertex name="B">
<directed-edge-to vertex="C"/>
<directed-edge-to vertex="D"/>
</vertex>
<vertex name="C">
<directed-edge-to vertex="E"/>
</vertex>
<vertex name="D">
<directed-edge-to vertex="E"/>
</vertex>
<vertex name="E">
<directed-edge-to vertex="G"/>
</vertex>
<vertex name="F">
<directed-edge-to vertex="G"/>
</vertex>
<vertex name="G"/>
</dag>
यह DAG इस तरह से तैयार किया जा सकता है:
मैं लागू करना चाहते हैं एक XSLTstylesheet है कि एक और एक्सएमएल दस्तावेज है कि केवल कोने में शामिल है का उत्पादन जो आंशिक क्रम के minimal elements के अनुरूप है। यही वह ऊर्ध्वाधर है जिसमें कोई आने वाली किनार नहीं है। उदाहरण ग्राफ के लिए न्यूनतम शोर का सेट {A, B, F}
है। अपने निर्माण निर्भरता आवेदन के लिए, यह सेट खोजने मूल्यवान है क्योंकि मुझे पता है कि अगर मैं इस सेट के सदस्यों का निर्माण, तो अपने प्रोजेक्ट में सब कुछ का निर्माण किया जाएगा है।
यहां मेरा वर्तमान स्टाइलशीट समाधान है (मैं इसे अपाचे एंटी के xslt
कार्य का उपयोग कर जावा पर ज़लान के साथ चला रहा हूं)। ,
<?xml version="1.0" encoding="UTF-8"?>
<minimal-vertices>
<minimal-vertex name="A"/>
<minimal-vertex name="B"/>
<minimal-vertex name="F"/>
</minimal-vertices>
बात है: एक प्रमुख अवलोकन है कि एक न्यूनतम शिखर किसी भी directed-edge-to
तत्व में संदर्भित नहीं किया जाएगा:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xslt"
exclude-result-prefixes="xalan">
<xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>
<xsl:template match="dag">
<minimal-vertices>
<xsl:for-each select="//vertex">
<xsl:if test="not(//vertex/directed-edge-to[@vertex=current()/@name])">
<minimal-vertex name="{@name}"/>
</xsl:if>
</xsl:for-each>
</minimal-vertices>
</xsl:template>
</xsl:stylesheet>
इस स्टाइलशीट लागू करने निम्नलिखित निर्गम (जो मेरा मानना है कि सही है) पैदा करता है मैं इस समाधान से पूरी तरह संतुष्ट नहीं हूं। मैं अगर वहाँ for-each
की select
और XPath वाक्य रचना के साथ if
की test
गठबंधन करने के लिए एक रास्ता है सोच रहा हूँ।
मैं की तरह कुछ लिखना चाहते हैं:
<xsl:for-each select="//vertex[not(//vertex/directed-edge-to[@vertex=current()/@name])]">
लेकिन है कि मैं क्या चाहते current()
समारोह बाहरी //vertex
अभिव्यक्ति द्वारा चयनित नोड्स को संदर्भित नहीं करती क्योंकि नहीं करता है।
thusfar, मेरे समाधान XPath 1.0 और XSLT 1.0 सिंटैक्स का उपयोग करता है, हालांकि मैं भी XPath 2.0 और XSLT 2.0 वाक्य रचना के लिए खुला रहा हूँ।
यहाँ चींटी निर्माण स्क्रिप्ट यदि आप चाहें तो है:
<?xml version="1.0"?>
<project name="minimal-dag" default="default">
<target name="default">
<xslt in="dag.xml" out="minimal-vertices.xml" style="find-minimal-vertices.xsl"/>
</target>
<target name="dot">
<xslt in="dag.xml" out="dag.dot" style="xml-to-dot.xsl"/>
</target>
</project>
dot
लक्ष्य ग्राफ प्रतिपादन के लिए GraphvizDotlanguage कोड उत्पन्न करता है।यहाँ xml-to-dot.xsl
है:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xslt"
exclude-result-prefixes="xalan">
<xsl:output method="text"/>
<xsl:template match="dag">
digraph {
rankdir="BT";
node [style="filled", fillcolor="cyan", fontname="Helvetica"];
<xsl:apply-templates select="//directed-edge-to"/>
}
</xsl:template>
<xsl:template match="directed-edge-to">
<xsl:value-of select="concat(ancestor::vertex/@name, '->', @vertex, ';')"/>
</xsl:template>
</xsl:stylesheet>
जब भी संभव हो, "//" संक्षेप से बचा जाना चाहिए क्योंकि यह बहुत महंगा है, जिससे पूरे उपट्री को संदर्भ नोड पर खोजा जा सकता है। शीर्ष स्तर पर "//" पूरे एक्सएमएल दस्तावेज़ को खोजा जा सकता है। जब भी एक्सएमएल दस्तावेज़ की संरचना XPath अभिव्यक्ति –