2011-07-22 28 views
7

Ben XSLT Newbie ve basit bir görev var değerleri:XSLT: Belirli niteliğini değiştirme

varsayalım Aşağıdaki XML vardır:

<Element1> 
    <Element2 attr1="1"/> 
</Element1> 
<Element1 attr1="2"/> 
<Element1> 
    <Element2 attr1="2"/> 
</Element1> 

Ben XML dönüştürmek istiyorum tek bir değişiklikle aynı XML: "attr1" adlı tüm öznitelikler nerede dönüştürülecekleri önemli değil, örneğin "1" "A" ve "2" "X" olacak, i. e.

<Element1> 
    <Element2 attr1="A"/> 
</Element1> 
<Element1 attr1="X"/> 
<Element1> 
    <Element2 attr1="X"/> 
</Element1> 

için nasıl bunu başarabilirsiniz? Şimdiden teşekkürler!

cevap

8

Karakterleri değiştirmek ve değiştirmek için karakterleri tanımlayabilirsiniz, ardından translate kullanın. Bu XSLT kullanabilirsiniz:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:variable name="in">12</xsl:variable> 
    <xsl:variable name="out">AX</xsl:variable> 

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

    <xsl:template match="@attr1"> 
     <xsl:attribute name="attr1"> 
      <xsl:value-of select="translate(., $in, $out)"/> 
     </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

bir başka yolu: tüm maç olacak

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="@attr1"> 
     <xsl:choose> 
      <xsl:when test=". = '1'"> 
       <xsl:attribute name="attr1"> 
        <xsl:text>A</xsl:text> 
       </xsl:attribute> 
      </xsl:when> 
      <xsl:when test=". = '2'"> 
       <xsl:attribute name="attr1"> 
        <xsl:text>X</xsl:text> 
       </xsl:attribute> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

<xsl:template match="@attr1"> o zaman bu özellik için uygun bir değer oluşturur xsl:choose kullanarak, attr1 bağlıyor.

+0

' xsl değiştirmek, çalışma zamanı özelleştirme yerleştirmek için : param'. –

8

Örneğin @ attr = 3 olduğunda ne olduğunu söylemediniz, aksi halde seçilenlerden biri değilse değeri kopyalamak için başka bir deyim yoktur. kullanılarak

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="@attr1"> 
    <xsl:attribute name="attr1"> 
    <xsl:choose> 
     <xsl:when test=". = 1"> 
     <xsl:text>A</xsl:text> 
     </xsl:when> 
     <xsl:when test=". = 2"> 
     <xsl:text>X</xsl:text> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="." /> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 
+0

Değerler dışarıdan mı kaynaklanacaksa? Anlamı, "1" -> "A" ve "2" -> "X" haritalamalarına sahip olacak bir harici haritalama dosyası nasıl kullanılabilir? – Amol

+0

@Amol daha sonra, dış belgeye başvuran [tuş işlevi] (http://www.w3schools.com/xsl/func_key.asp) kullanarak bir arama kurabilirsiniz. –

+0

Daha fazla netlik elde etmek için [bu] (http://stackoverflow.com/questions/14065523/applying-templates-multiple-times-based-on-string-values-from-other-document) sorusunu sordum. – Amol

2

başka yolu da, document fonksiyonu: 2 versiyonu aşağıda

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:l="local" 
> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="@attr1"> 
     <xsl:attribute name="attr1"> 
      <xsl:value-of select="document('')//l:item[l:in = current()]/l:out"/> 
     </xsl:attribute> 
    </xsl:template> 

    <xml xmlns="local"> 
     <item> 
      <in>1</in> 
      <out>A</out> 
     </item> 
     <item> 
      <in>2</in> 
      <out>X</out> 
     </item> 
    </xml> 

</xsl:stylesheet> 
+0

Belgeye karşı anahtar arama kullanmak daha verimli olmaz mıydı? –

0

xslt çalışır: xsl `için variable`:

<xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="@attr1[.='1']"> 
     <xsl:attribute name="attr1"> 
      <xsl:value-of select="replace(.,'1','A')"/> 
     </xsl:attribute> 
    </xsl:template> 

    <xsl:template match="@attr1[.='2']"> 
     <xsl:attribute name="attr1"> 
      <xsl:value-of select="replace(.,'2','X')"/> 
     </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet>