如何使用 XSLT 3 使用模板遍历 parse-xml-fragment 结果的未知内容?
How to walk through unknown content of the result of parse-xml-fragment using templates using XSLT 3?
晚上好,
我在使用 XSL-T 3.0 将 "parse-xml-fragment" 的结果传递给模板时遇到问题。我正在使用 Saxon-PE 9.7.0.15(Java 版本捆绑在最新的 oXygen 19 中)。我希望能够将(已经)定义的模板应用于 "parse-xml-fragment" 的结果 "document-node",就好像它是原始 XML 文档的一部分,而不是一个定义属性的 base64 内容.换句话说,我需要遍历 "parse-xml-fragment" 结果的未知内容。
我可以使用例如
从 base64 内容中获取值
<xsl:value-of select="parse-xml-fragment(saxon:base64Binary-to-string(./@a, 'UTF-8'))/base64Root/a/@at"/>
但假设我知道给定属性的 base64 值的结构和内容,我不知道。
XML 文件是:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="a.xsl"?>
<root a="PGJhc2U2NFJvb3Q+PGEgYXQ9IjEiPjwvYT48YiBhdD0iMiI+PC9iPjwvYmFzZTY0Um9vdD4="/>
<!--
content of @a is (and may vary in structure and content):
<base64Root><a at="1"></a><b at="2"></b></base64Root>
-->
XSL-T 3.0 文件(无法正常工作)是:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:saxon="http://saxon.sf.net/" exclude-result-prefixes="xs" version="3.0">
<xsl:output method="text" />
<xsl:template match="/root">
<xsl:call-template name="anyElement">
<xsl:with-param name="xmlFragment" select="parse-xml-fragment(saxon:base64Binary-to-string(./@a, 'UTF-8'))"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="anyElement" match="*">
<xsl:param name="xmlFragment"/>
<xsl:value-of select="local-name(.)"/>
<xsl:value-of select="./@at"/>
<xsl:apply-templates>
<xsl:with-param name="xmlFragment" select="."/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
期望的输出类似于(现在格式不重要):
root
PGJhc2U2NFJvb3Q+PGEgYXQ9IjEiPjwvYT48YiBhdD0iMiI+PC9iPjwvYmFzZTY0Um9vdD4=
base64Root
a
1
b
2
非常感谢您的提前帮助。斯捷潘
我只是将带有 apply-templates
的节点推送到您的模板匹配元素节点,我不确定您为什么先调用模板:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:saxon="http://saxon.sf.net/"
exclude-result-prefixes="xs math saxon"
version="3.0">
<xsl:output method="text" />
<xsl:template match="/root">
<xsl:next-match/>
<xsl:apply-templates select="parse-xml-fragment(saxon:base64Binary-to-string(@a, 'UTF-8'))/node()"/>
</xsl:template>
<xsl:template match="*">
<xsl:value-of select="local-name(), @*" separator=" "/>
<xsl:text> </xsl:text>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
输出为
root
PGJhc2U2NFJvb3Q+PGEgYXQ9IjEiPjwvYT48YiBhdD0iMiI+PC9iPjwvYmFzZTY0Um9vdD4=
base64Root
a
1
b
2
晚上好,
我在使用 XSL-T 3.0 将 "parse-xml-fragment" 的结果传递给模板时遇到问题。我正在使用 Saxon-PE 9.7.0.15(Java 版本捆绑在最新的 oXygen 19 中)。我希望能够将(已经)定义的模板应用于 "parse-xml-fragment" 的结果 "document-node",就好像它是原始 XML 文档的一部分,而不是一个定义属性的 base64 内容.换句话说,我需要遍历 "parse-xml-fragment" 结果的未知内容。
我可以使用例如
从 base64 内容中获取值<xsl:value-of select="parse-xml-fragment(saxon:base64Binary-to-string(./@a, 'UTF-8'))/base64Root/a/@at"/>
但假设我知道给定属性的 base64 值的结构和内容,我不知道。
XML 文件是:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="a.xsl"?>
<root a="PGJhc2U2NFJvb3Q+PGEgYXQ9IjEiPjwvYT48YiBhdD0iMiI+PC9iPjwvYmFzZTY0Um9vdD4="/>
<!--
content of @a is (and may vary in structure and content):
<base64Root><a at="1"></a><b at="2"></b></base64Root>
-->
XSL-T 3.0 文件(无法正常工作)是:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:saxon="http://saxon.sf.net/" exclude-result-prefixes="xs" version="3.0">
<xsl:output method="text" />
<xsl:template match="/root">
<xsl:call-template name="anyElement">
<xsl:with-param name="xmlFragment" select="parse-xml-fragment(saxon:base64Binary-to-string(./@a, 'UTF-8'))"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="anyElement" match="*">
<xsl:param name="xmlFragment"/>
<xsl:value-of select="local-name(.)"/>
<xsl:value-of select="./@at"/>
<xsl:apply-templates>
<xsl:with-param name="xmlFragment" select="."/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
期望的输出类似于(现在格式不重要):
root
PGJhc2U2NFJvb3Q+PGEgYXQ9IjEiPjwvYT48YiBhdD0iMiI+PC9iPjwvYmFzZTY0Um9vdD4=
base64Root
a
1
b
2
非常感谢您的提前帮助。斯捷潘
我只是将带有 apply-templates
的节点推送到您的模板匹配元素节点,我不确定您为什么先调用模板:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:saxon="http://saxon.sf.net/"
exclude-result-prefixes="xs math saxon"
version="3.0">
<xsl:output method="text" />
<xsl:template match="/root">
<xsl:next-match/>
<xsl:apply-templates select="parse-xml-fragment(saxon:base64Binary-to-string(@a, 'UTF-8'))/node()"/>
</xsl:template>
<xsl:template match="*">
<xsl:value-of select="local-name(), @*" separator=" "/>
<xsl:text> </xsl:text>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
输出为
root
PGJhc2U2NFJvb3Q+PGEgYXQ9IjEiPjwvYT48YiBhdD0iMiI+PC9iPjwvYmFzZTY0Um9vdD4=
base64Root
a
1
b
2