xpath选择以foo结尾的所有属性?

时间:2017-03-20 19:26:46

标签: xml xslt xpath xslt-1.0

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>

2 个答案:

答案 0 :(得分:4)

XPath 2.0解决方案

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)

XPath 1.0解决方案

string-joinends-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(.)"

基于kjhughes answerthis SO answer