当这个 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