如何将xml的所有完整元素提取到文本文件中?

时间:2012-11-21 15:41:04

标签: xslt

我有一个包含用户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,但我不明白......有人可以帮忙。 感谢

1 个答案:

答案 0 :(得分: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