XSLT:从另一个节点中查找属性值等于另一个属性的节点

时间:2017-02-27 06:20:01

标签: xslt

<?xml version="1.0" encoding="UTF-8"?> <Root xmlns="http://www.tcxml.org/Schemas/TCXMLSchema"> <TreeNode bbd="" id="TreeNodID" vid="VirtualID" /> <ChildNode bbd="bbd1" date="2017-02-22T15:04:32Z" object="ChildNodeID" thread="TreeNodID" /> </Root>

我想写一个xslt,它会重写像

这样的xml
<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <TreeNode bbd="bbd1" id="TreeNodeID" vid="VirtualID" object="ChildNodeID" />
    <ChildNode bbd="bbd1" date=&quot;2017-02-22T15:04:32Z object="ChildNodeID" thread="TreeNodeID" />
</Root>

我想找到任何节点的/*/@thread属性等于TreeNode/@id的节点。获取匹配节点的@object属性的值,并将其填充到TreeNode元素中。同时获取bbd值并将其填充到TreeNode元素中。

我不知道匹配节点是ChildNode还是其他。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

您也可以使用

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:aa="http://www.tcxml.org/Schemas/TCXMLSchema">
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="aa:TreeNode">
        <xsl:variable name="id" select="@id"/>
        <xsl:copy>
            <xsl:attribute name="bbd" select="//*[@thread eq $id]/@bbd"/>
            <xsl:copy-of select="@*[normalize-space(.) ne '']"></xsl:copy-of>
            <xsl:attribute name="object" select="//*[@thread eq $id]/@object"/>
            <xsl:apply-templates select="node()"></xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

我可以使用以下xslt来完成此操作 `

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="TreeNode">
        <xsl:copy>
            <xsl:if test="/*/node()/@thread=@id">
                <xsl:attribute name="object">
                    <xsl:value-of select="/*/node()/@object"/>
                </xsl:attribute>
            </xsl:if>          
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

`

剩下的部分是 - 如果存在,则bbd然后检查值是否为空,然后添加属性并填充值,如果已经填充了某个值,则保持原样。 否则添加属性并填充值。