我对XSLT不太熟悉。
基本上,我的原始XML中有一系列项目,它看起来像这样:
示例输入文档
<Items>
<Items>Item1</Items>
<Items>item2</Items>
<Items>Item3</Items>
</Items>
来自示例输入的预期输出文档
<Items>
<Items>
<Item1>Y</Item1>Item1</Items>
<Items>
<Item1 />item2</Items>
<Items>
<Item1 />Item3</Items>
</Items>
如何使用XSLT检查每个Items
并在修改后的XML字段中插入Y
符号,或者如果找不到这样的项目,请将该字段留空?
我现在有这样的事情,但我不确定这是否是一种正确的做法
<xsl:if test="Items='Item1'">
<Item1>Y</Item1>
</xsl:if>
<xsl:if test="Items!='Item1'">
<Item1></Item1>
</xsl:if>
答案 0 :(得分:1)
您不需要使用任何明确的条件XSLT指令 - 模板和模板模式是您的朋友:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Items[not(*)]/text()[. = 'Item1']">Y</xsl:template>
<xsl:template match="Items[not(*)]/text()" priority="0"/>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<Items>
<Items>Item1</Items>
<Items>item2</Items>
<Items>Item3</Items>
</Items>
产生了想要的正确结果:
<Items>
<Items>Y</Items>
<Items/>
<Items/>
</Items>
<强>解释强>:
identity rule 复制每个节点,并按“原样”选择执行该节点。
有两个重写模板 - 一个用于Items
的文本节点子节点,其值为“Item1”(“替换”),第二个 - 用于任何其他文本节点子节点Items
- 由于其空身而“删除”它。
“删除”模板将priority
属性设置为低(为零),以便明确解决与“替换”模板的任何优先级冲突。