从多个标签中获取值 xslt

Get value from mutiple tags xslt

使用以下XML

<?xml version="1.0" encoding="utf-8"?>
<Subjects>
  <Subject>
    <Title>Mr</Title>
    <Firstname></Firstname>
    <Surname></Surname>
    <Email></Email>
    <Incidents>
      <Incident>
        <ReferenceNo>meuen</ReferenceNo>
      </Incident>
    </Incidents>
    <TelephoneNos />
    <Employers />
    <BankAccounts />
  </Subject>
  <Subject>
    <Title>Mr</Title>
    <Firstname>Test</Firstname>
    <Surname>Test</Surname>
    <Email>test@test.com</Email>
    <Incidents>
      <Incident>
        <ReferenceNo>jkcsdlkjsdl</ReferenceNo>
      </Incident>
    </Incidents>
    <TelephoneNos />
    <Employers />
    <BankAccounts />
  </Subject>
</Subjects>

我想提取所有 ```ReferenceNo` 标签并表示如下:

<RefNos>
   <RefNo>meuen</RefNo>
   <RefNo>jkcsdlkjsdl</RefNo>
</RefNos>

我试过使用下面的 XSLT:

<RefNos>
                <xsl:for-each select="(//*[local-name() ='ReferenceNo'][text()])">
                    <xsl:variable name="incidentNumbers" select="(//*[local-name() ='ReferenceNo'])"/>
                    <RefNo>
                        <xsl:value-of select="$incidentNumbers[text()]"/>
                    </RefNo>
                </xsl:for-each>
            </RefNos>

但这只会获取XML中第一个填充的项目,如果顶部标签为空,则只有底部标签的值,反之亦然。

到select所有ReferenceNo个元素,只需使用//ReferenceNo。要将它们中的每一个转换为 RefNo 元素,请使用

<xsl:template match="/">
  <RefNos>
    <xsl:apply-templates select="//ReferenceNo"/>
  </RefNos>
</xsl:template>

<xsl:template match="ReferenceNo">
  <RefNo>
    <xsl:value-of select="."/>
  </RefNo>
</xsl:template>

//开头的路径是选择文档根节点的所有后代的绝对路径。因此,您的变量始终包含整个 XML 文档中的所有 ReferenceNo 节点,而不管当前 ReferenceNo 节点是什么。而在 XSLT 1.0 中,xsl:value-of 指令 returns 仅显示所选节点集中第一个节点的值。

如果将变量更改为仅包含当前 ReferenceNo 节点:

<xsl:variable name="incidentNumbers" select="."/>

它将如您所愿地工作。


当然,这一切都过于复杂了。不需要变量,而且 - 最重要的是 - 永远不需要诉诸像这样的黑客:

*[local-name() ='ReferenceNo']

此外,最好使用显式路径而不是 //。例如:

<xsl:template match="/Subjects">
    <RefNos>
        <xsl:for-each select="Subject">
            <RefNo>
                <xsl:value-of select="Incidents/Incident/ReferenceNo"/>
            </RefNo>
        </xsl:for-each>
    </RefNos>
</xsl:template>

在这种情况下应该能正常工作。