XSLT - 根据兄弟节点的值检索节点

问题描述 投票:0回答:2

我有以下示例 XML:

<?xml version="1.0"encoding="UTF-8"?>
<Root>
    <Record>
        <JobProfile>
            <Status>
                <Code>Pending</Code>
            </Status>
            <ID>
                <Code>007</Code>
            </ID>
        </JobProfile>
        <JobProfile>
            <Status>
                <Code>Active</Code>
            </Status>
            <ID>
                <Code>003</Code>
            </ID>
        </JobProfile>
        <JobProfile>
            <Status>
                <Code>Terminated</Code>
            </Status>
            <ID>
                <Code>004</Code>
            </ID>
        </JobProfile>
    </Record>
</Root>

我需要得到如下输出:

<Root>
    <Record>
        <ID>003</ID>
    </Record>
</Root>

逻辑是 - 读取输入 XML,找到 JobProfile/Status/Code =“Active”的节点。找到后,读取兄弟级别的 JobProfile/ID/Code 并将其写入输出中。

尝试了下面的 XSLT 但它不起作用

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="/Root/Record">
        <ID>
            <xsl:for-each select="Record/JobProfile">
                <xsl:if test="Status/Code='Active'">
                    <xsl:value-of select="ID/Code"/>
                </xsl:if>
            </xsl:for-each>
        </ID>
    </xsl:template>
</xsl:stylesheet>
xslt
2个回答
0
投票

使用

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="/Root/Record/JobProfile[Status/Code != 'Active']"/>

    <xsl:template match="/Root/Record/JobProfile[Status/Code = 'Active']">
      <ID>
        <xsl:value-of select="ID/Code"/>
      </ID>
    </xsl:template>
</xsl:stylesheet>

0
投票
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>
  
  <!-- Identity template : copy all text nodes, elements and attributes -->   
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- filter JobProfile which is not Active and all Status elements-->   
  <xsl:template match="JobProfile[not(Status/Code = 'Active')]|Status"/>
  
  <!-- skip JobProfile|Code but apply templates to use  ID-->   
  <xsl:template match="JobProfile|Code">
    <xsl:apply-templates select="@*|node()"/>
  </xsl:template>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.