XPATH复制前一个元素的节点值

时间:2019-10-18 23:39:27

标签: xslt xpath

我希望在尝试创建的XPATH上获得帮助。

我具有以下XML文件结构:

<Request>
    <RequestArea>
        <SourceText>**Text 1**</SourceText>
    </RequestArea>
    <ResponseArea>
        <TargetText></TargetText>
    </ResponseArea>
</Request>
<Request>
    <RequestArea>
        <SourceText>**Text 2**</SourceText>
    </RequestArea>
    <ResponseArea>
        <TargetText></TargetText>
    </ResponseArea>
</Request>

我需要复制 SourceText 节点的值并将其粘贴到以下 TargetText 节点中。

因此,生成的XML文件将是这样:

<Request>
    <RequestArea>
        <SourceText>**Text 1**</SourceText>
    </RequestArea>
    <ResponseArea>
        <TargetText>**Text 1**</TargetText>
    </ResponseArea>
</Request>
<Request>
    <RequestArea>
        <SourceText>**Text 2**</SourceText>
    </RequestArea>
    <ResponseArea>
        <TargetText>**Text 2**</TargetText>
    </ResponseArea>
</Request>

我有以下XSL:

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

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


<xsl:template match="TargetText">
    <ResponseText>
        <xsl:value-of select="preceding::SourceText"/>
    </ResponseText>
</xsl:template>


</xsl:stylesheet>

但是XSL引擎(MSXSL)将文本1 值复制到两个随后的 TargetText 节点中,而不是使用以下每个 SourceText 值作为源对于要复制的内容:

<Request>
    <RequestArea>
        <SourceText>**Text 1**</SourceText>
    </RequestArea>
    <ResponseArea>
        <TargetText>**Text 1**</TargetText>
    </ResponseArea>
</Request>
<Request>
    <RequestArea>
        <SourceText>**Text 2**</SourceText>
    </RequestArea>
    <ResponseArea>
        <TargetText>**Text 1**</TargetText>
    </ResponseArea>
</Request>

关于我在做什么错的任何建议?

谢谢!

1 个答案:

答案 0 :(得分:1)

只需将XSLT中的第二个模板替换为

<xsl:template match="ResponseArea/TargetText">
    <ResponseText>
        <xsl:value-of select="../../RequestArea/SourceText"/>
    </ResponseText>
</xsl:template>

如果您需要像在所需的示例输出中那样将元素命名为TargetText而不是ResponseText,只需对其进行更改。

以上代码的输出为:

<Request>
    <RequestArea>
        <SourceText>**Text 1**</SourceText>
    </RequestArea>
    <ResponseArea>
        <ResponseText>**Text 1**</ResponseText>
    </ResponseArea>
</Request>
<Request>
    <RequestArea>
        <SourceText>**Text 2**</SourceText>
    </RequestArea>
    <ResponseArea>
        <ResponseText>**Text 2**</ResponseText>
    </ResponseArea>
</Request>
相关问题