【问题标题】:XSL query inner xmlXSL 查询内部 xml
【发布时间】:2015-05-26 01:20:12
【问题描述】:

说这是我的 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 版本 1 迁移到新版本。

【问题讨论】:

    标签: xslt transformation


    【解决方案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(或支持序列化作为扩展的处理器),这一切都可以在同一个转换过程中完成。

    【讨论】:

    • 谢谢迈克尔。好主意。我把它当作一个字符串。您能否给我一个提示,如何将该内部文本加载为 XML 并在 XSLT 3.0 中查询该文本?
    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多