从多个标签中获取值 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>
在这种情况下应该能正常工作。
使用以下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>
在这种情况下应该能正常工作。