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