XSL 查询内部 xml
XSL query inner xml
说这是我的 xml :
<History>
<University>TSU</University>
<Payload>
<Attrib Order="0">OVERSEA</Attrib>
<Attrib Order="1">GRADE2</Attrib>
<Attrib Order="2"><Person><ID>TQR344</ID></Person></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 转移到新版本。
I want to query the inner XML inside Order=2 tag
有问题的标签不包含任何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="/History">
<Event>
<Uni>
<xsl:value-of select="University" />
</Uni>
<ID>
<xsl:value-of select="substring-before(substring-after(Payload/Attrib[@Order='2'], '<ID>'),'</ID><')"/>
</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 :
<History>
<University>TSU</University>
<Payload>
<Attrib Order="0">OVERSEA</Attrib>
<Attrib Order="1">GRADE2</Attrib>
<Attrib Order="2"><Person><ID>TQR344</ID></Person></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 转移到新版本。
I want to query the inner XML inside Order=2 tag
有问题的标签不包含任何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="/History">
<Event>
<Uni>
<xsl:value-of select="University" />
</Uni>
<ID>
<xsl:value-of select="substring-before(substring-after(Payload/Attrib[@Order='2'], '<ID>'),'</ID><')"/>
</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(或支持序列化作为扩展的处理器)这一切都可以在同一转换过程中完成。