-1

对于以下 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>';
4

1 回答 1

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>
于 2013-05-02T04:10:18.873 回答