xslt根据导入的节点集的匹配替换值

时间:2014-12-12 00:58:01

标签: xml xslt

我正在尝试导入节点集,然后搜索输入流并对值匹配进行替换。

我相信它足以说传入的xml看起来像:

<someElement name="replaceMe" id="1">
<someElement name="replaceMeToo" id="2">

和导入的节点(myNodeSet)设置如下:

<parentOfMatch name="replaceWithThisValue">
    <matchName>replaceMe</matchName>
</parentOfMatch>
<parentOfMatch name="replaceWithThisValueToo">
    <matchName>replaceMeToo</matchName>
</parentOfMatch>

我想要的结果是:

<someElement name="replaceWithThisValue" id="1">
<someElement name="replaceWithThisValueToo" id="2">

我的微弱尝试:

<xsl:variable name="root" select="/"/>
<xsl:variable name="myNodeSet" select="collection('file:/C:/temp/?select=*.xml;recurse=yes')"/>

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

<xsl:template match="someElement/@name">
    <xsl:for-each select=".=$myNodeSet/parentOfMatchName/matchName">
        <xsl:attribute name="name">
        <!-- but here I can't select the parent of the context node. 
             how can I change the for-each -->
        <!-- select ro make parentOfMatchName node the context but 
             compare with the matchName node? -->
            <xsl:value-of select="../@name"/>
        </xsl:attribute>
    </xsl:for-each>
</xsl:template>

再一次,我试图在$ myNodeSet / parentOfMatchName / matchName的传入节点集中找到所有someElement / @ name节点,并用$ myNodeSet / parentOfMatchName / @ name替换someElement / @ name。

感谢一帮。

1 个答案:

答案 0 :(得分:0)

您不需要for-each。这就是你所需要的:

<xsl:template match="someElement/@name">
    <xsl:variable name="replacement"
                  select="$myNodeSet/parentOfMatch[matchName = current()]/@name" />
    <xsl:attribute name="name">
        <xsl:value-of select="$replacement | (.)[not($replacement)]"/>
    </xsl:attribute>
</xsl:template>