我正在尝试导入节点集,然后搜索输入流并对值匹配进行替换。
我相信它足以说传入的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。
感谢一帮。
答案 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>