如何使用XSLT动态获取子值

时间:2015-08-24 09:47:03

标签: xml xslt

我有以下xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <row>
      <first-name>John</first-name>
      <last-name>Miller</last-name>
      <address>Birmingham</address>
   </row>
   <row>
      <first-name>Rose</first-name>
      <last-name>Miller</last-name>
      <address>New York</address>
   </row>
</root>

我想使用XSLT修改xml,输出如下:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <row>
      <Name>John-Miller</Name>
      <address>Birmingham</address>
   </row>
   <row>
      <Name>Rose-Miller</Name>
      <address>New York</address>
   </row>
</root>

总结一下,我希望连接<first-name><last-name>以生成一个名为<Name>的新节点,并保持<address>标记不变(同样的事情应该发生)在每个<row>)。

我正在尝试使用以下XSLT,但没有获得所需的输出:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="node() | @*">
      <xsl:copy>
         <xsl:apply-templates select="node() | @*" />
      </xsl:copy>
   </xsl:template>
   <xsl:template match="row">
      <row>
         <Name>
            <xsl:value-of select="concat(//first-name,'-',//last-name)" />
         </Name>
      </row>
   </xsl:template>
</xsl:stylesheet>

当我针对输入xml运行上面的XSLT时,我只得到第一行的<first-name><last-name>值。 你能提供解决方案吗?

1 个答案:

答案 0 :(得分:2)

您需要使用相对路径,这意味着您需要将<xsl:value-of select="concat(//first-name,'-',//last-name)" />替换为<xsl:value-of select="concat(first-name,'-',last-name)" />。而且你需要确保复制地址:

   <xsl:template match="row">
      <row>
         <Name>
            <xsl:value-of select="concat(first-name,'-',last-name)" />
         </Name>
         <xsl:copy-of select="address"/>
      </row>
   </xsl:template>