XPATH / XSLT 1.0是否可以选择以“Foo”结尾的所有属性?
我正在编写一些XSLT来获取所有“InterestingElement”的所有属性值的列表,其中属性名称以“Foo”结尾。
实际上我还想过滤出值为空""
我尝试为XSLT 2.0指定样式表但得到了xsl:version: only 1.0 features are supported
:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:xdt="http://www.w3.org/2005/xpath-datatypes">
到目前为止,我有:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:for-each select="//InterestingElement">
<xsl:value-of select="__what goes here?__"/><xsl:text>
</xsl:text>
</xsl:for-each>
<xsl:text>end</xsl:text>
</xsl:template>
</xsl:stylesheet>
这是一些示例XML:
<?xml version="1.0"?>
<root>
<Other Name="Bob"/>
<InterestingElements>
<InterestingElement AttrFoo="want this"
Attr2Foo="this too"
Blah="not this"
NotThisFoo=""/>
</InterestingElements>
</root>
答案 0 :(得分:4)
XPath 2.0可以解决这个问题;在XSLT 2.0中,不需要xsl:for-each
- 只需xsl:value-of
。
这个XPath,
string-join(//InterestingElement/@*[ends-with(name(.), 'Foo') and . != ''], ' ')
将返回名称以InterestingElement
结尾的所有Foo
个属性的(非空)值的空格分隔列表。
答案 1 :(得分:3)
string-join
和ends-with
是XPath 2.0。对于1.0,您可以使用以下命令,它返回由空格分隔的所有值:
<xsl:for-each select="//InterestingElement/@*['Foo' = substring(name(.), string-length(name(.)) - string-length('Foo') +1) and . != '']">
<xsl:value-of select="." /><xsl:text> </xsl:text>
</xsl:for-each>
要获取匹配的属性名称而不是值,请将选择更改为select="name(.)"