使用XSLT从XML节点检索文本

时间:2013-05-23 14:42:39

标签: xml xslt

如果这看起来像一个非常基本的问题,我很抱歉,但我真的(我的意思是真的)感谢我能得到的任何帮助。我只是想做以下事情:
1.用
替换自动关闭 2.从'Second_node'中抓取文本 3.将该文本存储在变量中 4.将该文本放入新的“Seventh_node”中。

我已经完成了第1步,但我似乎无法从必需的元素中检索必要的信息。我在下面列举了三个例子以及我正在使用的XSLT。我想关键问题是存储'Second_node'的文本内容并将其放在新元素中。通过添加信息,我使用Saxon 6.5进行转换。如果提供的信息仍然不完整,请告诉我。

谢谢!

源XML:

<firstnode>
  <Second_node>text for second node</Second_node>
   <Third_node>
     <Fourth_node>
       <Fifth_node>text for fifth node</Fifth_node>
       <Sixth_node>text for sixth node</Sixth_node>
        <Seventh_node />
   </Fourth_node>
 </Third_node>
</firstnode>

到目前为止我所拥有的:

<firstnode>
  <Second_node>text for second node</Second_node>
   <Third_node>
     <Fourth_node>
       <Fifth_node>text for fifth node</Fifth_node>
       <Sixth_node>text for sixth node</Sixth_node>
        <Seventh_node></Seventh_node>
   </Fourth_node>
   </Third_node>
</firstnode>

我需要什么:

<firstnode>
  <Second_node>text for second node</Second_node>
   <Third_node>
     <Fourth_node>
       <Fifth_node>text for fifth node</Fifth_node>
       <Sixth_node>text for sixth node</Sixth_node>
        <Seventh_node>text for second node</Seventh_node>
   </Fourth_node>
   </Third_node>
</firstnode>

到目前为止我的XSLT:

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


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

        <xsl:text>text for second node</xsl:text>
    </xsl:copy>
</xsl:template>

3 个答案:

答案 0 :(得分:1)

您可以尝试将第二个节点中的文本放入变量中,然后使用该变量将该文本放在第七个节点中。

<xsl:variable name="VAR_SecNode">
   <xsl:value-of select="Second_node"/>
</xsl:variable>

...
<Seventh_node><xsl:value-of select="$VAR_SecNode" /></Seventh_node>
...

答案 1 :(得分:1)

我认为不需要变量 试试这个:

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

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

    <xsl:template match="Seventh_node">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:value-of select="//Second_node"/>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

<xsl:apply-templates select="@*"/>将复制Seventh_node的属性。 <xsl:apply-templates select="node()"/>将复制Seventh_node的子节点。如果你不需要删除这一行。

答案 2 :(得分:0)

您可以将第二个模板更新为以下内容:

<xsl:template match="Seventh_node/text()">
    <xsl:text>text for second node</xsl:text>
</xsl:template>

这只会匹配Seventh_node的文字,并将其替换为<xsl:text>元素中的内容。