Xml XSLT:从一个上下文移动到每个上下文中的其他上下文节点

Xml XSLT:从一个上下文移动到每个上下文中的其他上下文节点,xml,xslt,xslt-1.0,xslt-2.0,Xml,Xslt,Xslt 1.0,Xslt 2.0,我正在编写一个XSL转换,在这个转换中,我无法移动到根目录并访问每个目录中的其他节点 假设我在一个上下文中。在这种情况下,我必须到外部节点获取一个值,然后返回到相同的上下文 这是我的XML文件 <xml version=1.0> <abc> <parts> <part pno="10506"> <pname>Land Before Time I</pn

我正在编写一个XSL转换,在这个转换中,我无法移动到根目录并访问每个目录中的其他节点

假设我在一个上下文中。在这种情况下,我必须到外部节点获取一个值,然后返回到相同的上下文

这是我的XML文件

    <xml version=1.0>

    <abc>
     <parts>
            <part pno="10506">
              <pname>Land Before Time I</pname>
              <qoh>200</qoh>
              <price>19.99</price>
              <level>20</level>
            </part>
            …
      </parts>
       <orders>
            <order ono="1022" takenBy="1001" customer="2222">
              <receivedDate>1995-02-13</receivedDate>
              <shippedDate>1995-02-20</shippedDate>
              <items>
                <item>
                  <partNumber>10601</partNumber>
                  <quantity>1</quantity>
                </item>
                <item>
                  <partNumber>10701</partNumber>
                  <quantity>1</quantity>
                </item>
              </items>
         </order>

     .....
     </orders>
    </abc>

在我到达之前着陆
200
19.99
20
…
1995-02-13
1995-02-20
10601
1.
10701
1.
.....
我在xsl:for-each中的“item”标记内进行迭代,但我想进入“part”标记内,获取一个值并返回到相同的上下文

更详细地说:我正在填一张表。我的表格有4列:

  • partname:我必须转到
    获取名称。(这就是我被卡住的地方)
  • 数量:这对我来说不是问题,因为它是
    的子元素
  • 普莱斯:我也面临同样的问题
  • 道达尔:很简单
请帮助我从零件标签中获取零件名称和价格的值

以下代码不适用于我

  <?xml version="1.0" encoding="UTF-8"?>

    <xsl:stylesheet>

        <table>
             <xsl:param name="param1" />

             <xsl:variable name="temp" select ="name(/*)"/>
               <xsl:for-each select=".//order[@ono=$param1]/items/item">
                     <tr>
          <td> <xsl:value-of select="$temp//part[@pno=partNumber]/pname"/>  </td>
          <td> <xsl:value-of select="quantity"/> </td>                                                       
          <td> <xsl:value-of select="$temp//part[@pno=partNumber]/price"/>  </td>
          <td> <xsl:value-of select="quantity*$temp//part[@pno=partNumber]/price"/>  </td>
                </tr>
            </xsl:for-each>
           </table>      




    <xsl:stylesheet>

我试着用谷歌搜索,但我找不到解决问题的确切方法。我写的代码抛出了一些错误。我尝试将“temp”的选择值更改为root(.),但不起作用

我只需要一个提示。我不需要答案。给我一个暗示就够了


在过去的5个小时里,我一直被这个问题困扰着。请回复并帮助我。

Root不是
。根目录是
/
。如果希望根元素的任何子元素名为“part”,请使用
//part

如果将
放在
之前,将
放在
之后,那么当XML解析器解析文档根时,XSL处理器将生成表元素

您的
xsl:stylesheet
open标记需要几个属性。XSLT1.0应该是

我认为这一点信息可能足以让你的工作


如果需要提高效率,应该避免使用
/
,而是使用
xsl:key
。您可以找到的定义、基础知识和简单示例。

当您想从谓词内部引用与当前上下文相关的内容时,可以使用
current()


然而,这里更有效的方法是使用键。我还对XSLT进行了一些清理,以更好地使用模板并避免路径中的重复:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:key name="kPart" match="part" use="@pno" />

  <xsl:param name="param1" select="1022" />

  <xsl:template match="/">
    <table>
      <xsl:apply-templates select="//order[@ono=$param1]/items/item" />
    </table>
  </xsl:template>

  <xsl:template match="item">
    <xsl:variable name="part" select="key('kPart', partNumber)" />
    <tr>
      <td>
        <xsl:value-of select="$part/pname"/>
      </td>
      <td>
        <xsl:value-of select="quantity"/>
      </td>
      <td>
        <xsl:value-of select="$part/price"/>
      </td>
      <td>
        <xsl:value-of select="quantity * $part/price"/>
      </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:key name="kPart" match="part" use="@pno" />

  <xsl:param name="param1" select="1022" />

  <xsl:template match="/">
    <table>
      <xsl:apply-templates select="//order[@ono=$param1]/items/item" />
    </table>
  </xsl:template>

  <xsl:template match="item">
    <xsl:variable name="part" select="key('kPart', partNumber)" />
    <tr>
      <td>
        <xsl:value-of select="$part/pname"/>
      </td>
      <td>
        <xsl:value-of select="quantity"/>
      </td>
      <td>
        <xsl:value-of select="$part/price"/>
      </td>
      <td>
        <xsl:value-of select="quantity * $part/price"/>
      </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>