我正在编写此XSLT文件,并且在如何执行以下操作方面存在问题。我有一个具有相同名称属性的元素列表,我需要将它们复制并检查它们是否具有必需的文本。如果没有元素没有添加一个元素。
示例XML:
<record>
</Title>
</subTitle>
<note tag='1'>
<access tag='1'>nothing</access>
<access tag='a'>Home</access>
<access tag='a'>School</access>
</note tag='1'>
</record>
通过该示例,它将输出:
<record>
</Title>
</subTitle>
<note tag='1'>
<access tag='1'>nothing</access>
<access tag='a'>Home</access>
<access tag='a'>School</access>
<access tag="a'>Required</access>
</note tag='1'>
</record>
如果生成的xml再次通过xslt,它将按原样输出而不进行任何更改。如果使用属性a访问只能是1个元素,我知道如何做到这一点。我遇到的问题是检查多个。
感谢您的帮助。
答案 0 :(得分:1)
这是一个简短的解决方案:
<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=
"note[not(access[@tag = 'a' and . = 'Required'])]">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<access tag="a">Required</access>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档(将格式错误的原始文档更正为格式良好的XML文档):
<record>
<Title/>
<subTitle/>
<note tag='1'>
<access tag='1'>nothing</access>
<access tag='a'>Home</access>
<access tag='a'>School</access>
</note>
</record>
产生了想要的正确结果:
<record>
<Title/>
<subTitle/>
<note tag="1">
<access tag="1">nothing</access>
<access tag="a">Home</access>
<access tag="a">School</access>
<access tag="a">Required</access>
</note>
</record>
答案 1 :(得分:0)
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="note[count(access[text()='Required'])=0]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:element name="access">
<xsl:attribute name="tag">a</xsl:attribute>
Required
</xsl:element>
</xsl:copy>
</xsl:template>