我在尝试阅读源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>
预期产出结构(有两个要求) -
一种是将< >
转换为格式良好的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获得第一个输出。
如果我们可以直接从输入源获得第二个输出 - 它实际上是预期的解决方案。对于上述 - 我只是试图将问题分解为步骤。
任何专家都可以帮忙!
谢谢,
答案 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>