XSLT

2012-06-18 12 views
10

में कुंजी मूल्य संकल्पना कार्यान्वित करना मैं एक्सएसएलटी पर काम कर रहा हूं, जहां मुझे निम्नानुसार कुछ लागू करने की आवश्यकता है। मेरा स्रोत एक्सएमएल नमूना इस तरह दिखता है।XSLT

<?xml version="1.0" encoding="ISO-8859-1"?> 
    <catalog> 
     <cd> 
      <title>A</title> 
      <title>B</title> 
      <title>C</title> 
     </cd> 
    </catalog> 

विचार करें कि कुछ महत्वपूर्ण मूल्य जोड़ी सूची है।

Key   Value 
    A   Algebra 
    B   Biology 
    C   Chemistry 
    D   Data Analysis 
    ---   --- 

    ----  --- 

मुझे एक xslt लिखने की आवश्यकता है कि कुंजी 'ए' के ​​हर अवसर के लिए उचित मूल्य के साथ प्रतिस्थापित करने की आवश्यकता है।

मुझे उसी एक्सएसएलटी में महत्वपूर्ण मूल्य जोड़े की सूची का भी उल्लेख करना होगा। नमूना आउटपुट:

<Data> 
    <Subject>Algebra</Subject> 
    <Subject>Biology</Subject> 
    <Subject>Chemistry</Subject> 
</Data> 

किसी भी एक मेरी मदद कर सकते बाहर कैसे करना है।

धन्यवाद।

उत्तर

16

आई सरल XSLT 1.0 समाधान

यह परिवर्तन:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<my:codes> 
    <code key="A" value="Algebra"/> 
    <code key="B" value="Biology"/> 
    <code key="C" value="Chemistry"/> 
    <code key="D" value="Data Analysis"/> 
</my:codes> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
    "title/text()[. = document('')/*/my:codes/*/@key]"> 

    <xsl:value-of select= 
    "document('')/*/my:codes/*[@key=current()]/@value"/> 
</xsl:template> 
</xsl:stylesheet> 

जब प्रदान की XML दस्तावेज़ पर लागू:

<catalog> 
    <cd> 
     <title>A</title> 
     <title>B</title> 
     <title>C</title> 
    </cd> 
</catalog> 

का उत्पादन चाहता था, सही परिणाम:

<catalog> 
    <cd> 
     <title>Algebra</title> 
     <title>Biology</title> 
     <title>Chemistry</title> 
    </cd> 
</catalog> 

स्पष्टीकरण:

यह एक वैश्विक तत्व (xsl:stylesheet के चाइल्ड तत्व) है कि एक (गैर खाली) के अंतर्गत आता है के रूप में इनलाइन एक्सएमएल नोड सहित मानक तरीका है नामस्थान, एक्सएसएल नेमस्पेस से अलग है।


II। अधिक कुशल XSLT 1.0 समाधान, कुंजियों का उपयोग:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="my:my"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <my:codes> 
     <code key="A" value="Algebra"/> 
     <code key="B" value="Biology"/> 
     <code key="C" value="Chemistry"/> 
     <code key="D" value="Data Analysis"/> 
    </my:codes> 

    <xsl:key name="kCodeByName" match="code" use="@key"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match= 
     "title/text()[. = document('')/*/my:codes/*/@key]"> 

     <xsl:variable name="vCur" select="."/> 

     <xsl:for-each select="document('')"> 
      <xsl:value-of select= 
      "key('kCodeByName', $vCur)/@value"/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

जब इस बदलाव एक ही XML दस्तावेज़ (ऊपर), एक ही सही पर लागू किया जाता है, चाहते थे परिणाम उत्पादन किया जाता है:

<catalog> 
    <cd> 
     <title value="Algebra"/> 
     <title value="Biology"/> 
     <title value="Chemistry"/> 
    </cd> 
</catalog> 

स्पष्टीकरण:

key() फ़ंक्शन के माध्यम से डेटा तक पहुंच आमतौर पर उप-रैखिक - अक्सर ओ (1) होता है और यह बेहद फायदेमंद है रैखिक खोज से ter (जो महत्वपूर्ण है यदि नोड्स की खोज की संख्या बड़ी है)।

किसी अन्य दस्तावेज़ के नोड को संसाधित करते समय एक दस्तावेज़ (xsl:key) के माध्यम से एक दस्तावेज़ के नोड तक पहुंचना संभव है यदि नोड को देखने के लिए दस्तावेज़ वर्तमान दस्तावेज़ है। अन्य दस्तावेज़ से नोड्स तक पहुंचने के लिए, इसकी जड़ (या ब्याज के नोड को सहेजने और एक चर से संदर्भित करने की आवश्यकता है।)


III। XSLT 2.0 समाधान:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="vCodes"> 
    <codes> 
    <code key="A" value="Algebra"/> 
    <code key="B" value="Biology"/> 
    <code key="C" value="Chemistry"/> 
    <code key="D" value="Data Analysis"/> 
    </codes> 
</xsl:variable> 

<xsl:key name="kCodeByName" match="code" use="string(@key)"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
    "title/text()[key('kCodeByName', ., $vCodes)]"> 

    <xsl:sequence select= 
    "key('kCodeByName', ., $vCodes)/@value"/> 
</xsl:template> 
</xsl:stylesheet> 

जब इस बदलाव, एक ही XML दस्तावेज़ (ऊपर), एक ही सही पर लागू किया जाता है चाहता था परिणाम उत्पादन किया जाता है:

<catalog> 
    <cd> 
     <title value="Algebra"/> 
     <title value="Biology"/> 
     <title value="Chemistry"/> 
    </cd> 
</catalog> 

स्पष्टीकरण:

लगभग कुशल XSLT 1.0 समाधान के समान ही है, लेकिन:

  1. एक्सएसएलटी 2.0 में एक टेम्पलेट मैच पैटर्न में एक चर संदर्भ शामिल हो सकता है।

  2. एक्सएसएलटी 2.0 में वर्तमान और अनुक्रमित दस्तावेज़ों में हेरफेर करने वाली एक्रोबेटिक चाल की कोई आवश्यकता नहीं है - key() फ़ंक्शन का तीसरा तर्क उस पेड़ को निर्दिष्ट करना है जिसका सूचकांक उपयोग करना है।

+0

उत्तर के लिए धन्यवाद। – Patan

+0

@ उपयोगकर्ता 222: आपका स्वागत है। –

+0

@Dimitre क्या हम समाधान III में टेम्पलेट को कॉल कर सकते हैं। एक्सएसएलटी 2.0 एक और टेम्पलेट में। यदि हां, तो कृपया मुझे बताएं कि कैसे? –

 संबंधित मुद्दे