0

My xml looks like:

<record>
    <name>ABC</name>
    <address>
        &lt;street&gt;sss&lt;/street&gt;
        &lt;city&gt;ccc&lt;/city&gt;
        &lt;state&gt;ttt&lt;/state&gt;
    </address>
</record>

I am trying to read the element 'street' using the xsl:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output omit-xml-declaration="yes" indent="yes" />
    <xsl:template match="/">
        <xsl:value-of select="record/address/street" />
    </xsl:template>
</xsl:stylesheet>

but it doesn't give any output.

Why does this happen even though the input xml is in a valid xml format? So how to transform xml files containing character entities for element names?

4

3 回答 3

0

没有street元素。如果它被写入,<street>...</street>那么它将是一个元素,但尖括号已被仔细转义以表明它应该被视为纯文本。

将包含尖括号的纯文本转换为 XML 节点结构涉及解析;也就是说,您需要对address元素的文本内容执行第二次解析。由于您在这里拥有的是一个 XML 片段而不是一个完整的 XML 文档,因此这很复杂。

在 XSLT 3.0 中,您可以使用 parse-xml-fragment() 函数来实现这一点。在早期版本中,您可以通过调用自定义扩展函数来实现它,或者(如@sandeepkamboj 建议的那样)通过在 XSLT 中编写一个简单的 XML 解析器来实现它(为此,您需要确信您知道 XML 的哪个子集您需要处理的结构)。

也许最好的方法是找出为什么有人生成了这个荒谬的文档,并让他们改正自己的方式。

于 2019-02-04T08:54:25.140 回答
0

添加到迈克尔凯的答案:

如果您首先使用以下方式处理您的 XML:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="address">
    <xsl:copy>
        <xsl:value-of select="." disable-output-escaping="yes"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

并将结果保存到文件中,然后您就可以使用样式表来处理生成的文件并获得预期的结果。

于 2019-02-04T09:26:18.760 回答
-2
    <xsl:template match="//name"/>
<xsl:template match="record/address">
    <xsl:value-of select="substring-before(., '&lt;city&gt;ccc&lt;/city&gt;')" disable-output-escaping="yes"/>
</xsl:template>

检查此代码。

于 2019-02-04T05:29:44.383 回答