Xml XSLT2.0如何标记多个元素的值并将它们关联在一起以形成结果
我刚刚开始研究XSLT。我的输入和预期输出如下,XSLT也在下面给出。我现在面临两个问题Xml XSLT2.0如何标记多个元素的值并将它们关联在一起以形成结果,xml,xslt,xslt-2.0,tokenize,Xml,Xslt,Xslt 2.0,Tokenize,我刚刚开始研究XSLT。我的输入和预期输出如下,XSLT也在下面给出。我现在面临两个问题 如您所见,我正在动态分配变量名,它会引发以下异常 net.sf.saxon.trans.XPathException:属性轴的上下文项的必需项类型为node();提供的值具有项目类型xs:string 当我将变量名设置为某个静态字符串时,我没有收到异常,但没有看到预期的输出,即我想知道如何映射标记化的字符串 输入 1,2,3 a、 b,c 预期产量 1. A. 2. B 3. C XSLT 我不确定
net.sf.saxon.trans.XPathException:属性轴的上下文项的必需项类型为node();提供的值具有项目类型xs:string
1,2,3
a、 b,c
预期产量
1.
A.
2.
B
3.
C
XSLT
我不确定您显示的样式表为什么使用XSLT 1.0,因为您用XSLT 2.0标记了问题,而tokenize是一个2.0函数 另外,我认为您的预期输出包含一个输入错误。也许这就是你想写的:
<student>
<id>1</id>
<name>a</name>
</student>
<student>
<id>2</id>
<name>b</name>
</student>
因此,{@name}
的上下文是一个标记化字符串,当然没有任何属性
样式表
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/students">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="field[@name='id']">
<xsl:variable name="match" select="."/>
<xsl:for-each select="tokenize(.,',')">
<xsl:variable name="id-pos" select="position()"/>
<student>
<id>
<xsl:value-of select="."/>
</id>
<name>
<xsl:value-of select="tokenize($match/following-sibling::field[@name='name'],',')[position() = $id-pos]"/>
</name>
</student>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<id>1</id>
<name>a</name>
</student>
<student>
<id>2</id>
<name>b</name>
</student>
<student>
<id>3</id>
<name>c</name>
</student>
</students>
输出
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/students">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="field[@name='id']">
<xsl:variable name="match" select="."/>
<xsl:for-each select="tokenize(.,',')">
<xsl:variable name="id-pos" select="position()"/>
<student>
<id>
<xsl:value-of select="."/>
</id>
<name>
<xsl:value-of select="tokenize($match/following-sibling::field[@name='name'],',')[position() = $id-pos]"/>
</name>
</student>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<id>1</id>
<name>a</name>
</student>
<student>
<id>2</id>
<name>b</name>
</student>
<student>
<id>3</id>
<name>c</name>
</student>
</students>
1.
A.
2.
B
3.
C
我不确定您显示的样式表为什么使用XSLT 1.0,因为您用XSLT 2.0标记了问题,而tokenize是一个2.0函数
另外,我认为您的预期输出包含一个输入错误。也许这就是你想写的:
<student>
<id>1</id>
<name>a</name>
</student>
<student>
<id>2</id>
<name>b</name>
</student>
因此,{@name}
的上下文是一个标记化字符串,当然没有任何属性
样式表
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/students">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="field[@name='id']">
<xsl:variable name="match" select="."/>
<xsl:for-each select="tokenize(.,',')">
<xsl:variable name="id-pos" select="position()"/>
<student>
<id>
<xsl:value-of select="."/>
</id>
<name>
<xsl:value-of select="tokenize($match/following-sibling::field[@name='name'],',')[position() = $id-pos]"/>
</name>
</student>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<id>1</id>
<name>a</name>
</student>
<student>
<id>2</id>
<name>b</name>
</student>
<student>
<id>3</id>
<name>c</name>
</student>
</students>
输出
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/students">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="field[@name='id']">
<xsl:variable name="match" select="."/>
<xsl:for-each select="tokenize(.,',')">
<xsl:variable name="id-pos" select="position()"/>
<student>
<id>
<xsl:value-of select="."/>
</id>
<name>
<xsl:value-of select="tokenize($match/following-sibling::field[@name='name'],',')[position() = $id-pos]"/>
</name>
</student>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<id>1</id>
<name>a</name>
</student>
<student>
<id>2</id>
<name>b</name>
</student>
<student>
<id>3</id>
<name>c</name>
</student>
</students>
1.
A.
2.
B
3.
C
假设您不知道字段
元素的数量和名称,则以下内容更通用(并避免多次标记值):
假设您不知道
字段
元素的数量和名称,则以下内容更通用(并避免多次标记值):
向Mathias Muller道歉,这是我的错误。更正了打字错误。感谢您抽出时间回复。它很有魅力:)马蒂亚斯·穆勒道歉,那是我的错误。更正了打字错误。感谢您抽出时间回复。它很有魅力:)谢谢马丁的回复。我会花一些时间来理解这一点。谢谢马丁的回复。我将花一些时间来理解这一点。