处理< >在XSLT 1.0中

时间:2014-12-28 04:19:41

标签: xslt xslt-1.0

我在尝试阅读源XML中具有< >的结构时遇到问题。

输入结构 -

<?xml version="1.0" encoding="UTF-8"?>
<RecordsData>
  <RecordsData>
    <UID>&lt;RecordsData xmlns=&quot;&quot;&gt;&lt;RecordsData&gt;&lt;UID&gt;200&lt;/UID&gt;&lt;RID&gt;Test-1&lt;/RID&gt;&lt;Date&gt;20142812&lt;/Date&gt;&lt;Status&gt;N&lt;/Status&gt;&lt;/RecordsData&gt;&lt;/RecordsData&gt;</UID>
  </RecordsData>
</RecordsData>

预期产出结构(有两个要求) - 一种是将&lt; &gt;转换为格式良好的XML标记。

<?xml version="1.0" encoding="UTF-8"?>
<RecordsData>
  <RecordsData>
    <UID><RecordsData xmlns=""><RecordsData><UID>200</UID><RID>Test-1</RID><Date>20142812</Date><Status>N</Status></RecordsData></RecordsData></UID>
  </RecordsData>
</RecordsData>

其次是在UID标记内提取整个数据,输出仅在下面 -

<RecordsData xmlns=""><RecordsData><UID>200</UID><RID>Test-1</RID><Date>20142812</Date><Status>N</Status></RecordsData></RecordsData>

如果我手头有第一个输出,我可以得到第二个输出。但是在广泛搜索论坛并且对XSLT非常陌生之后,过去几天努力从Input获得第一个输出。

如果我们可以直接从输入源获得第二个输出 - 它实际上是预期的解决方案。对于上述 - 我只是试图将问题分解为步骤。

任何专家都可以帮忙!

谢谢,

1 个答案:

答案 0 :(得分:1)

转换很容易,提取不是。

要将转义标记转换为实际标记,只需在将节点写入结果树时禁用转义,例如:

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="UID">
    <xsl:copy>
        <xsl:value-of select="." disable-output-escaping="yes"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

理想情况下,您可以使用生成的XML文件从转义部分中提取任何数据。否则,您必须为此目的应用字符串函数,因为转义的文本不是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:template match="/">
    <xsl:value-of select="RecordsData/RecordsData/UID" disable-output-escaping="yes"/>
</xsl:template>

</xsl:stylesheet>