XSL查询内部xml

时间:2015-03-23 05:15:06

标签: xslt transformation

说这是我的xml:

<History>
    <University>TSU</University>
    <Payload>
        <Attrib Order="0">OVERSEA</Attrib>
        <Attrib Order="1">GRADE2</Attrib>
        <Attrib Order="2">&lt;Person&gt;&lt;ID&gt;TQR344&lt;/ID&gt;&lt;/Person&gt;</Attrib>
        <Attrib Order="3">3566644</Attrib>
    </Payload>
</History>

我想在Order = 2标签内查询内部XML并读取该人的ID。

到目前为止我创建了这个:

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     >

    <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />

    <xsl:template match="/History">
            <xsl:apply-templates select="/History" />
    </xsl:template>

    <xsl:template name="Person" match="//History">
        <Event>
            <Uni><xsl:value-of select="University" /></Uni>
            <ID><xsl:value-of select="Payload/Attrib[@Order='2']/Person/ID"  disable-output-escaping="yes" /></ID>
        </Event>
    </xsl:template>
</xsl:stylesheet>

但是你可以看到它不起作用。

此外,我将内部XML分配给变量,并尝试查询该变量,但它也不起作用。

是否可以通过xsl做到这一点?

限制:我无法更改xml格式。但也许我能够从xsl ver 1迁移到新版本。

1 个答案:

答案 0 :(得分:1)

  

我想在Order = 2标签

中查询内部XML

有问题的标签包含任何XML;它的内容是 string ,需要使用字符串函数进行操作。尝试:

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="/History">
    <Event>
        <Uni>
            <xsl:value-of select="University" />
        </Uni>
        <ID>
            <xsl:value-of select="substring-before(substring-after(Payload/Attrib[@Order='2'], '&lt;ID&gt;'),'&lt;/ID&gt;&lt;')"/>
        </ID>
    </Event>
</xsl:template>

</xsl:stylesheet>

注意

<强> 1。此

<xsl:template match="/History">
    <xsl:apply-templates select="/History" />
</xsl:template>

创建一个无限循环并使处理器崩溃。

2. 或者,您可以将字符串序列化为XML并将结果作为XML 处理;在XSLT 1.0中,只能通过输出禁用转义的字符串,将结果保存为新文档,然后使用其他XSLT样式表处理新文档来完成此操作。使用XSLT 3.0(或支持序列化作为扩展的处理器),这可以在同一转换过程中完成。