我只是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>`
但是,它并没有返回我主要不在知识领域中的所有值,而是查看了网络中的示例并尝试实现它们,但未获得预期的结果。
提出任何有关如何解决此问题的建议。
答案 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