根据同级子项选择的同级节点的属性值选择节点

时间:2018-12-27 17:43:04

标签: xslt xslt-1.0

XSLT相对较新。我上了一堂课,似乎已经掌握了这门课,但是这一堂课让我很沮丧。

我的组织有一个第三方系统,该系统可以在不同时间生成XML输出。我们有一个实用程序,可将XSLT应用于其他需要信息的组织。生成的XML具有类似于以下结构的部分,其中的相关数据包含在NodeType1和NodeType2节点中。

我们必须首先发送的新信息以TargetElement值为true的NodeType1节点为目标。然后,我们需要选择NodeType2节点,这些节点的ConID属性值与所选的那些NodeType1节点的ConID属性值相同。在提供的示例中,应选择ConID属性值为123456和964589的那些NodeType2节点。

因此,我尝试了几种条件组合,但没有运气。我尝试的最后一个看起来像

<xsl:apply-template select="NodeType2[./NodeType2/Container/Connection/@ConID = ../NodeType1/Container/Connection[TargetNode = 'True']/Connection/@ConID]

我已经经历了很多次,我无法确定我还尝试了什么

在此刻,任何帮助将不胜感激。

<?xml version = "1.0" encoding = "utf-8"?>
<Section>
    <NodeType1>
        <Container>
            <TargetElement>True</TargetElement>
            <Connection ConID="123456"></Connection>
        </Container>
      </NodeType1>
      <NodeType1>
        <Container>
            <Connection ConID="999999"></Connection>
        </Container>
      </NodeType1>
      <NodeType1>
        <Container>
        <TargetElement>True</TargetElement>
        <Connection ConID="964589"></Connection>
    </Container>
  </NodeType1>
  <NodeType2>
    <Container>
        <NameInformation>
            <First>Jo</First>
            <Last>Shmo</Last>
        </NameInformation>
        <Connection ConID="123456"></Connection>
    </Container>
  </NodeType2>
  <NodeType2>
    <Container>
        <NameInformation>
            <First>Who</First>
            <Last>First</Last>
        </NameInformation>
        <Connection ConID="999999"></Connection>
    </Container>
  </NodeType2>
  <NodeType2>
    <Container>
        <NameInformation>
            <First>What</First>
            <Last>Second</Last>
        </NameInformation>
        <Connection ConID="964589"></Connection>
    </Container>
  </NodeType2>

1 个答案:

答案 0 :(得分:1)

您拥有的是一个交叉引用-XSLT具有解决名为keys的交叉引用的特殊功能。

考虑以下示例:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="type2" match="NodeType2/Container" use="Connection/@ConID" />

<xsl:template match="/Section">
    <output>
        <xsl:for-each select="NodeType1/Container[TargetElement='True']">
            <xsl:copy-of select="key('type2', Connection/@ConID)/NameInformation"/>
        </xsl:for-each>
    </output>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<output>
  <NameInformation>
    <First>Jo</First>
    <Last>Shmo</Last>
  </NameInformation>
  <NameInformation>
    <First>What</First>
    <Last>Second</Last>
  </NameInformation>
</output>