1

我有一个包含用户 ID 和名称的 XML 文件。我想提取这两个属性都有值的所有元素。

这是我的xml

<pens>
<pen id="A">
    <user name="USER1" email="USER1EMAIL" />
</pen>
<pen id="B">
    <user name="USER2" email="USER2EMAIL" />
</pen>
<pen id="C"></pen>
<pen id="D">
    <user name="USER3" email="USER3EMAIL" />
</pen>
</pens>

我需要这样的出路

A - USER1
B - USER2
D - USER3

我用 XSL 试试,但我不明白……有人可以帮忙吗?谢谢

4

1 回答 1

3

当这个 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="no" indent="yes" method="text" />
  <xsl:strip-space elements="*" />

  <xsl:template match="user[@name][@email]">
    <xsl:value-of select="parent::*/@id" />
    <xsl:text> - </xsl:text>
    <xsl:value-of select="@name" />
    <xsl:text>&#10;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

...应用于您的原始 XML:

<pens>
  <pen id="A">
    <user name="USER1" email="USER1EMAIL"/>
  </pen>
  <pen id="B">
    <user name="USER2" email="USER2EMAIL"/>
  </pen>
  <pen id="C"/>
  <pen id="D">
    <user name="USER3" email="USER3EMAIL"/>
  </pen>
</pens>

...产生了想要的结果:

A - USER1
B - USER2
D - USER3

解释:

  • 我们将元素的@method属性设置<xsl:output>为值text(因为我们对文本结果感兴趣)。

  • 一个模板匹配已定义和属性<user>的元素。@name@email

  • <user>找到一个这样的元素时,我们输出其父元素的@id属性值、破折号、元素@name属性的值,最后是换行符。

将此结果保存到文件中取决于您使用的 XSLT 处理器。如果您通过命令行运行转换(例如,方式xsltproc),您可以执行以下操作:

$ xsltproc t.xsl input.xml > output.xml

于 2012-11-21T15:51:55.480 回答