2010-07-12 19 views
6

के लिए एक पूर्णांक मान रूपांतरण करें:एक दोहराया चरित्र

<node attribute="3"/> 

... यह इस नोड में बदलने चाहिए:

<node attribute="***"/> 

मेरे टेम्पलेट विशेषता से मेल खाता है और इसे पुन: प्रयास करता है, लेकिन मुझे नहीं पता कि मूल्य को कैसे सेट किया जाए: चरित्र '*' मूल विशेषता के मान के रूप में कई बार दोहराया जाता है।

<xsl:template match="node/@attribute"> 
    <xsl:variable name="repeat" select="."/> 
    <xsl:attribute name="attribute"> 
     <!-- What goes here? I think I can do something with $repeat... --> 
    </xsl:attribute> 
</xsl:template> 

धन्यवाद!

+0

आप किस एक्सएसएलटी प्रोसेसर का उपयोग कर रहे हैं? – AakashM

+1

मान लीजिए कि हम यह कर सकते हैं ... क्यों? डेटा परत पर काम करने के लिए '3' बहुत आसान नहीं है? प्रतीत होता है कि प्रस्तुति परत में केवल **** समझ में आता है। – polygenelubricants

+0

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

उत्तर

8

एक काफी गंदा लेकिन व्यावहारिक दृष्टिकोण क्या सबसे बड़ी संख्या क्या तुमने कभी का उपयोग attribute में देखने के लिए है, तो उम्मीद है पर एक फोन करना होगा

substring("****...", 1, $repeat) 

जहां कि के रूप में है कि स्ट्रिंग में के रूप में कई * रों है अधिकतम संख्या आप उम्मीद करते हैं। लेकिन मुझे आशा है कि कुछ बेहतर होगा!

+0

+1 यदि आप अधिकतम संख्या जानते हैं तो यह सबसे तेज़ दृष्टिकोण है। पहले से दोहराव की। – Tomalak

+0

जो मैं करता हूं, इसलिए यह काम करेगा। अनिवार्य XSLT 2.0 उत्तर प्रदान करने के लिए –

9

जेनेरिक, पुनरावर्ती समाधान (XSLT 1.0):

<xsl:template name="RepeatString"> 
    <xsl:param name="string" select="''" /> 
    <xsl:param name="times" select="1" /> 

    <xsl:if test="number($times) &gt; 0"> 
    <xsl:value-of select="$string" /> 
    <xsl:call-template name="RepeatString"> 
     <xsl:with-param name="string" select="$string" /> 
     <xsl:with-param name="times" select="$times - 1" /> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

कॉल के रूप में:

<xsl:attribute name="attribute"> 
    <xsl:call-template name="RepeatString"> 
    <xsl:with-param name="string" select="'*'" /> 
    <xsl:with-param name="times" select="." /> 
    </xsl:call-template> 
</xsl:attribute> 
7

@AakashM और @Tomalak, के दो अच्छा उत्तर देने के लिए जोड़ा जा रहा है इस XSLT में स्वाभाविक रूप से किया जाता है 2.0:

यह एक्सएसएलटी 2.0 परिवर्तन:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

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

<xsl:template match="@attribute"> 
    <xsl:attribute name="{name()}"> 
    <xsl:for-each select="1 to ."> 
     <xsl:value-of select="'*'"/> 
    </xsl:for-each> 
    </xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

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

<node attribute="***"/> 

ध्यान दें करो कैसे XPath 2.0 to ऑपरेटर प्रयोग किया जाता है:

<node attribute="3"/> 

वांछित परिणाम का उत्पादन <xsl:for-each> निर्देश में।

+0

+1! :-) – Tomalak

+0

मुझे यह प्रयास करना होगा कि सॉफ़्टवेयर (इनडिज़ीन सीएस 3) एक्सएसएलटी 2.0 का समर्थन करता है, लेकिन अच्छा जवाब, धन्यवाद! –

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