Xml XSLT2.0如何标记多个元素的值并将它们关联在一起以形成结果

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 我不确定

我刚刚开始研究XSLT。我的输入和预期输出如下,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道歉,这是我的错误。更正了打字错误。感谢您抽出时间回复。它很有魅力:)马蒂亚斯·穆勒道歉,那是我的错误。更正了打字错误。感谢您抽出时间回复。它很有魅力:)谢谢马丁的回复。我会花一些时间来理解这一点。谢谢马丁的回复。我将花一些时间来理解这一点。