1

我仍在学习 XSL,并且正在尝试将我从 XSL 获得的值更改为另一个值。(我正在使用在线网站使用 XSL 将我的 XML 转换为另一个 XML)

XML

<?xml version="1.0" encoding="UTF-8"?>
<Person>
    <Student>
        <Info Name="Jen" Age="20" Class="C" />
    </Student>
    <Student>
        <Info Name="Sam" Age="21" Class="B" />

    </Student>

</Person>

可以说有很多students(甚至同名)

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

   <xsl:template match="Person">
      <Person>

        <lookuptable>
          <name first="Jen" ori="Jenny" />
          <name first="Sam" ori="Sammy" />
        </lookuptable>

         <xsl:for-each select="Student">
           <Info Name="{Info/@Name}" Age="{Info/@Age}" Class="{Info/@Class}" />
         </xsl:for-each>

      </Person>
   </xsl:template>
</xsl:stylesheet>

我创建了一个查找表

输出是_

<?xml version="1.0" encoding="UTF-8"?>
<Person>
   <lookuptable>
      <name ori="Jenny" first="Jen" />
      <name ori="Sammy" first="Sam" />
   </lookuptable>
   <Info Class="C" Age="20" Name="Jen" />
   <Info Class="B" Age="21" Name="Sam" />
</Person>

我想更改我的输出,这意味着每次“Jen”出现时我希望它是“Jenny”等。使用我的查找表。我怎样才能做到这一点?还是更容易创建另一个 XSL 将输出(最后一个 XML)转换为我需要的要求?提前致谢..

4

2 回答 2

1

您可以将查找表放在一个变量中,并通过节点集扩展使用它。我在http://www.xsltcake.com/上试过

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
  xmlns:exsl="http://exslt.org/common">

  <xsl:variable name="lookuptable">
    <lookuptable>
      <name first="Jen" ori="Jenny" />
      <name first="Sam" ori="Sammy" />
    </lookuptable>
  </xsl:variable>

   <xsl:template match="Person">
      <Person>

        <xsl:copy-of select="$lookuptable"/>

         <xsl:for-each select="Student">
           <xsl:variable name="key" select="Info/@Name"/>
           <Info Age="{Info/@Age}" Class="{Info/@Class}">
             <xsl:attribute name="Name">
               <xsl:value-of select="exsl:node-set($lookuptable)/lookuptable/name[@first=$key]/@ori"/>
             </xsl:attribute>
           </Info>
         </xsl:for-each>

      </Person>
   </xsl:template>
</xsl:stylesheet>

有关这方面的详细信息,请参阅 Pavel Minaev 对XSL 的回答:How best to store a node in a variable and then us it in future xpath expressions? 它还解释了在使用 XSLT 2 时您将不需要 exsl 扩展。因此您可能希望改进我的 XSLT 2 方法。

于 2013-10-01T04:32:15.363 回答
1

这是@halfbit 答案的XSLT 2.0 版本(我没有将查找表复制到输出中,我认为这并不是真正想要的):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

  <xsl:variable name="lookuptable" as="element(name)*">
      <name first="Jen" ori="Jenny" />
      <name first="Sam" ori="Sammy" />
  </xsl:variable>

   <xsl:template match="Person">
      <Person>
         <xsl:for-each select="Student">
           <xsl:variable name="key" select="Info/@Name"/>
           <Info Age="{Info/@Age}" Class="{Info/@Class}">
             <xsl:attribute name="Name" select="$lookuptable[@first=$key]/@ori"/>
           </Info>
         </xsl:for-each>
      </Person>
   </xsl:template>
</xsl:stylesheet>
于 2013-10-01T06:14:27.527 回答