XSLT使用<解析XML和>

时间:2017-01-02 23:15:27

标签: xml xslt xml-parsing xslt-1.0

我有一个XML文档,其中包含一个包含以下示例代码的TextBlock。

<TextBlock>
  <config>This is a config.</config>
  <path>This is a file path.</path>
</TextBlock>

实际的XML文件包含以下内容

&lt;TextBlock&gt;
  &lt;config&gt;This is a config.&lt;/config&gt;
  &lt;path&gt;This is a file path.&lt;/path&gt;
&lt;/TextBlock&gt;

我试图使用XSLT 1.0获取路径标记的值

<h1>
  <xsl:value-of select="/TextBlock/path" disable-output-escaping="yes"/>
</h1>

由于&amp; lt&amp; gt而导致XML结构中断,因此我无法获得该值。 有没有办法解决这个问题,或者在XSLT中将&lt&gt转换为<>

2 个答案:

答案 0 :(得分:1)

Escaped XML只是一个无意义的文本字符串,无法使用XPath进行解析。

在给定的示例中,您可以使用:

<xsl:value-of select="substring-before(substring-after(/TextBlock, '&lt;path&gt;'), '&lt;/path&gt;')"/>

从给定文档中提取字符串"This is a file path."

或者,您可以处理文档两次:在第一遍中,使用disable-output-escaping取消对字符串的转换,然后在生成的文件中使用第二个样式表来提取现在的内容{{1元素。

加了:

如果您的整个文档已如您编辑的示例中所示进行转义,则它不是XML文档,并且XSLT(至少不是XSLT 1.0)根本无法处理。< / p>

答案 1 :(得分:0)

如果您有sed可用,则可以在使用XSLT处理文件之前通过它传输文件。

例如:要处理input.xmloutput.xml,您将执行

sed -e "s/&lt;/</g" input.xml | sed -e "s/&gt;/>/g" > output.xml

然后使用您选择的XSLT处理器处理output.xml 这会将所有&lt;&gt;实体转换为相应的字符。