使用 select-value 子句中的变量遍历 XML 路径

Usage of the Variable inside the select-value clause to traverse through the XML path

我正在尝试根据条件获取 XML 值,如果变量值与提到的 XML 路径的值匹配,则获取其自身子元素的值。 输入 XML 如下所示

<ns1:productSpecificationFullDTO xmlns:ns1="http://www.micros.com/creations/core/domain/dto/v1p0/full" xmlns:ns2="http://www.micros.com/creations/core/domain/dto/v1p0/simple">
<ns1:product>
    <ns1:name>Test Component 1</ns1:name>
    <ns1:parent>false</ns1:parent>
</ns1:product>
<ns1:product>
    <ns1:name>Test Component 2</ns1:name>
    <ns1:parent>false</ns1:parent>
</ns1:product>
<ns1:specification>
    <ns1:name>Test Component 1</ns1:name>
    <ns1:parent>false</ns1:parent>
    <ns1:Labeling>
        <ns1:mainProductTitle>Test1</ns1:ns1:mainProductTitle>
    </ns1:Labeling>
</ns1:specification>
<ns1:specification>
    <ns1:name>Test Component 2</ns1:name>
    <ns1:parent>false</ns1:parent>
    <ns1:Labeling>
        <ns1:mainProductTitle>Test2</ns1:ns1:mainProductTitle>
    </ns1:Labeling>
</ns1:specification>

我的 XSLT 定义如下

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://www.micros.com/creations/core/domain/dto/v1p0/full" xmlns:ns2="http://www.micros.com/creations/core/domain/dto/v1p0/simple" exclude-result-prefixes="ns1 ns1">
<xsl:template match="/">
    <ItemDetails>
        <Items>
            <!-- Food section start here -->
            <xsl:for-each select="/ns1:productSpecificationFullDTO/ns1:product/ns1:parent[text() != 'true']/../ns1:name[text() != 'Parent']/..">
                <xsl:variable name="subItem" select="ns1:name/text()"/>
                <Item>
                    <name>
                        <xsl:value-of select="$subItem"/>
                    </name>
                    <LongDescription>
                        <xsl:value-of select="normalize-space(ns1:productSpecificationFullDTO/ns1:specification/ns1:parent[text() != 'true']/../ns1:name[text() = '''$subItem''']/../ns1:Labeling/ns1:mainProductTitle/text())"/>
                    </LongDescription>
                </Item>
            </xsl:for-each>
        </Items>
    </ItemDetails>
</xsl:template>

输出结果如下

<Items>
  <Item>
     <name>Test Component 1</name>
     <LongDescription/>
  </Item>
  <Item>
     <name>Test Component 2</name>
     <LongDescription/>
  </Item>

期望的输出是

<Items>
  <Item>
     <name>Test Component 1</name>
     <LongDescription>Test1<LongDescription/>
  </Item>
  <Item>
     <name>Test Component 2</name>
     <LongDescription>Test2<LongDescription/>
  </Item>

如上所述,我无法获取该变量的子元素的值。 请指教,谢谢

我认为这解决了您试图完成的问题,简化了您的 XPath 表达式并使用一个键来获取链接的描述。

<xsl:stylesheet version="3.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:ns1="http://www.micros.com/creations/core/domain/dto/v1p0/full" 
  xmlns:ns2="http://www.micros.com/creations/core/domain/dto/v1p0/simple" 
  exclude-result-prefixes="ns1 ns2">
  
  <xsl:output method="xml" indent="yes"/>
  
  <xsl:key name="keySpec" match="ns1:specification" use="ns1:name"/>
  
  <xsl:template match="/">
      <ItemDetails>
          <Items>
              <!-- Food section start here -->
              <xsl:for-each select="/ns1:productSpecificationFullDTO/ns1:product[not(ns1:parent='true') and not(ns1:name='Parent')]">
                  <Item>
                      <name>
                          <xsl:value-of select="ns1:name"/>
                      </name>
                      <LongDescription>
                          <xsl:value-of select="key('keySpec',ns1:name)/ns1:Labeling/ns1:mainProductTitle"/>
                      </LongDescription>
                  </Item>
              </xsl:for-each>
          </Items>
      </ItemDetails>
  </xsl:template>

</xsl:stylesheet>

看到它在这里工作:https://xsltfiddle.liberty-development.net/6qjt5Sw/1