我想测试标签的存在并根据结果创建一个新节点。
这是输入XML:
<root>
<tag1>NS</tag1>
<tag2 id="8">NS</tag2>
<test>
<other_tag>text</other_tag>
<main>Y</main>
</test>
<test>
<other_tag>text</other_tag>
</test>
</root>
所需的输出XML是:
<root>
<tag1>NS</tag1>
<tag2 id="8">NS</tag2>
<test>
<other_tag>text</other_tag>
<Main_Tag>Present</Main_Tag>
</test>
<test>
<other_tag>text</other_tag>
<Main_Tag>Absent</Main_Tag>
</test>
</root>
我知道要测试标签的价值,但这对我来说是新的。
我尝试使用此模板: (根据要求不能正常工作)
<xsl:template match="test">
<xsl:element name="test">
<xsl:for-each select="/root/test/*">
<xsl:choose>
<xsl:when test="name()='bbb'">
<xsl:element name="Main_Tag">
<xsl:text>Present</xsl:text>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="Main_Tag">
<xsl:text>Absent</xsl:text>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:element>
</xsl:template>
答案 0 :(得分:5)
这是怎么回事:
<xsl:choose>
<xsl:when test="main = 'Y'">
<Main_Tag>Present</Main_Tag>
</xsl:when>
<xsl:otherwise>
<Main_Tag>Absent</Main_Tag>
</xsl:otherwise>
</xsl:choose>
或者
<Main_Tag>
<xsl:choose>
<xsl:when test="main = 'Y'">Present</xsl:when>
<xsl:otherwise>Absent</xsl:otherwise>
</xsl:choose>
</Main_Tag>
答案 1 :(得分:1)
您可以使用Xpath count function查看main
节点是否存在(count(name) = 0
)并相应地输出。
答案 2 :(得分:1)
扩展Rubens Farias的第二个答案......
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!--Identity transform-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--Add <Main_Tag>Present</Main_Tag> or <Main_Tag>Absent</Main_Tag>.-->
<xsl:template match="test">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<Main_Tag>
<xsl:choose>
<xsl:when test="main = 'Y'">Present</xsl:when>
<xsl:otherwise>Absent</xsl:otherwise>
</xsl:choose>
</Main_Tag>
</xsl:copy>
</xsl:template>
<!--Remove all <main> tags-->
<xsl:template match="main"/>
</xsl:stylesheet>
答案 3 :(得分:1)
我并不认为这是优越的 - 对于这个问题,我可能完全按照Rubens Farias描述的方式进行 - 但它显示了另一种解决问题的方法,这种方法在更复杂的情况下可能会有用。我发现我推入模板匹配的逻辑越多,我的转换就越灵活,可扩展性就越长。所以,将这些添加到身份转换:
<xsl:template match="test/main">
<Main_Tag>present</Main_Tag>
</xsl:template>
<xsl:template match="test[not(main)]">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<Main_Tag>absent</Main_Tag>
</xsl:copy>
</xsl:copy>