2010-04-21 19 views
6

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

<?xml version='1.0' encoding='utf-8'?> 
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
    xmlns:msxsl='urn:schemas-microsoft-com:xslt' exclude-result-prefixes='msxsl'> 
    <xsl:output method='xml' indent='yes'/> 
    <xsl:template match='*'> 
     <xsl:copy> 
     <xsl:attribute name='ElementID'> 
      <xsl:value-of select='generate-id()'/> 
     </xsl:attribute> 
     <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template>  
</xsl:stylesheet> 

धन्यवाद।

+0

क्या यह एक्सएसएलटी 1.0 होना चाहिए? क्या आप 2.0 में अपडेट कर सकते हैं? – topskip

+0

एक्सएसएलटी 2.0 ठीक रहेगा। – gregn

+0

अच्छा प्रश्न (+1)। एक अधिक कुशल और सरल समाधान के लिए मेरा जवाब देखें। :) –

उत्तर

3

स्तर और गिनती के साथ संख्या() का उपयोग करके स्विचिंग चाल चल रही है।

धन्यवाद

<?xml version='1.0' encoding='utf-8'?> 
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
    xmlns:msxsl='urn:schemas-microsoft-com:xslt' exclude-result-prefixes='msxsl'> 
    <xsl:output method='xml' indent='yes'/> 
    <xsl:template match='*'> 
     <xsl:copy> 
     <xsl:attribute name='ElementID'> 
      <xsl:number level='any' count='*' /> 
     </xsl:attribute> 
     <xsl:copy-of select="@*"/><!--copy of existing all attributes--> 
     <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

यह वैध एक्सएसएलटी 1.0 है, इस मामले में एक्सएसएलटी 2.0 की कोई आवश्यकता नहीं है। बस साथ ही, चूंकि आपके कोड में आपने XML के लिए संस्करण संख्या बदल दी है, एक्सएसएलटी नहीं। ;-) – markusk

+0

अच्छी तरह से देखा गया मार्कस, 2.0 हटाया गया – gregn

+0

मौजूदा गुणों को संरक्षित करने के लिए जोड़ा गया – gregn

7

तुम हमेशा उपयोग कर सकते हैं:

माइकल Kay के रूप में
 concat(count(ancestor::node()), 
      '00000000', 
      count(preceding::node())) 

जानकार लोगों चेतावनी दी है कि <xsl:number/> कुशल नहीं है (कभी कभी हे (एन^2)) और यदि संभव हो तो से बचा जाना चाहिए।

+0

यह भी काम करता है, मैं प्रदर्शन पर नजर रखूंगा। – gregn

+0

आपके पास एक गलत स्थान है; जिस समाधान का आप संभवतः चाहते थे वह है 'कंसट (काउंटर :: नोड()),' 00000000 ', गिनती (पिछला :: नोड())) –

+0

@ टोड्डमियर: इसे ध्यान में रखने के लिए धन्यवाद। अभी सुधार हुआ –

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