对于以下XML
<SampleXMLFormat>
<Header>
<Id>123</Id>
</Header>
<Properties>
<property name="a1_prop1" value="val1"/>
<property name="a1_prop2" value="val2"/>
<property name="a2_prop1" value="val1"/>
<property name="a2_prop2" value="val2"/>
<property name="abcd" value="efgh"/>
</Properties>
</SampleXMLFormat>
我可以获取XSLT转换以获得以下输出:
1)没有前缀为a2
<SampleXMLFormat>
<Header>
<Id>123</Id>
</Header>
<Properties>
<property name="a1_prop1" value="val1"/>
<property name="a1_prop2" value="val2"/>
<property name="abcd" value="efgh"/>
</Properties>
</SampleXMLFormat>
2)仅限前缀为a2
<property name="a2_prop1" value="val1"/>
<property name="a2_prop2" value="val2"/>
@ABach对于第二部分,我试着这个..而不是选择所有节点,我试图只选择属性节点,但我得到格式错误的输出。你能告诉我做错了什么?
xslt = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="property|node()">
<xsl:copy>
<xsl:apply-templates select="property|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="property[not(starts-with(@name, \'BOND_\'))]"/>
</xsl:stylesheet>';
答案 0 :(得分:0)
答案#1
当这个XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<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="property[starts-with(@name, 'a2')]"/>
</xsl:stylesheet>
...适用于提供的XML:
<SampleXMLFormat>
<Header>
<Id>123</Id>
</Header>
<Properties>
<property name="a1_prop1" value="val1"/>
<property name="a1_prop2" value="val2"/>
<property name="a2_prop1" value="val1"/>
<property name="a2_prop2" value="val2"/>
<property name="abcd" value="efgh"/>
</Properties>
</SampleXMLFormat>
...生成了想要的结果:
<SampleXMLFormat>
<Header>
<Id>123</Id>
</Header>
<Properties>
<property name="a1_prop1" value="val1"/>
<property name="a1_prop2" value="val2"/>
<property name="abcd" value="efgh"/>
</Properties>
</SampleXMLFormat>
答案#2
当这个XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<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="property[not(starts-with(@name, 'a2'))]"/>
</xsl:stylesheet>
...适用于提供的XML:
<SampleXMLFormat>
<Header>
<Id>123</Id>
</Header>
<Properties>
<property name="a1_prop1" value="val1"/>
<property name="a1_prop2" value="val2"/>
<property name="a2_prop1" value="val1"/>
<property name="a2_prop2" value="val2"/>
<property name="abcd" value="efgh"/>
</Properties>
</SampleXMLFormat>
...生成了想要的结果:
<SampleXMLFormat>
<Header>
<Id>123</Id>
</Header>
<Properties>
<property name="a2_prop1" value="val1"/>
<property name="a2_prop2" value="val2"/>
</Properties>
</SampleXMLFormat>
编辑: OP在第二个问题上增加了一些清晰度。在这种情况下,这个XSLT应该可以解决这个问题:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:copy-of select="*/property[starts-with(@name, 'a2')]" />
</xsl:template>
</xsl:stylesheet>