使用XSLT 1.0从XML中提取属性,该属性可以在任意位置

时间:2018-07-25 20:16:32

标签: xslt-1.0

我只是XML / XSL的入门者,并且得到了一个文件,用于从中提取使用的AudioFiles。

XML在很多地方都包含名为AudioFile的ATTRIBUTE,其内容是wave文件名,例如request_welcome.wav。这些属性可以在文件中的任何位置,我需要的只是wave文件名称的列表

该属性为<ATTRIBUTE NAME="AudioFile"><VALUE>hold.wav</VALUE></ATTRIBUTE>,可以在XML中的任何地方

我用过:

`<xsl:for-each select="ENTRY">
   <xsl:for-each select="ATTRIBUTE">
     <xsl:if test="@NAME='AudioFile'">
       <xsl:value-of select="VALUE"/>
     </xsl:if>
   </xsl:for-each>
 </xsl:for-each>`

但是,它并没有返回我主要不在知识领域中的所有值,而是查看了网络中的示例并尝试实现它们,但未获得预期的结果。

提出任何有关如何解决此问题的建议。

1 个答案:

答案 0 :(得分:0)

由于您已经提到元素<ATTRIBUTE>可以在XML中的任何位置,所以我猜输入的XML将类似于

<ENTRY>
    <ATTRIBUTE NAME="AudioFile">
        <VALUE>hold.wav</VALUE>
    </ATTRIBUTE>
    <NODE1>
        <ATTRIBUTE NAME="AudioFile">
            <VALUE>hold1.wav</VALUE>
        </ATTRIBUTE>
        <NODE2>
            <ATTRIBUTE NAME="AudioFile">
                <VALUE>hold2.wav</VALUE>
            </ATTRIBUTE>
        </NODE2>
    </NODE1>
    <NODE3>
        <ATTRIBUTE NAME="AudioFile">
            <VALUE>hold4.wav</VALUE>
        </ATTRIBUTE>
    </NODE3>
</ENTRY>

如果要输出ATTRIBUTE/VALUE的值,则可以使用模板方法而不是使用for-each。下面的模板将输出值。

<xsl:template match="ATTRIBUTE[@NAME = 'AudioFile']">
    <Name>
        <xsl:value-of select="VALUE" />
    </Name>
</xsl:template>

如果您需要使用for-each,则需要使用//对其进行编码,该<ATTRIBUTE>会在XML中查找所有<xsl:for-each select="//ATTRIBUTE[@NAME = 'AudioFile']" > 元素,而不管它们的位置如何。

<Name>hold.wav</Name>
<Name>hold1.wav</Name>
<Name>hold2.wav</Name>
<Name>hold4.wav</Name>

但是首选模板方法,因为XSLT旨在在模板上工作。

输出应为

dangerouslySetInnerHTML