我无法从我的 xml 中以 xsl 编码获取子循环中的根节点数据

Posted

技术标签:

【中文标题】我无法从我的 xml 中以 xsl 编码获取子循环中的根节点数据【英文标题】:I am not able to get the root node data in the child loop in xsl coding from my xml 【发布时间】:2021-02-16 08:16:30 【问题描述】:

xsl编码中如何获取子循环中的根节点数据 您能否介绍一下如何在我的子循环中获取根节点数据。 或者还有其他方法可以做到这一点而不是下面;感谢你的帮助。 我的 XML

<wd:Report_Data xmlns:wd="urn:com.workday.report/INT_Outbound">
    <wd:Report_Entry>
        <wd:Employee_ID>12345</wd:Employee_ID>
        <wd:LastName>Raj</wd:LastName>
        <wd:FirstName>Kiran</wd:FirstName>
        <wd:Dependents>
            <wd:Dependent_ID>D1245</wd:Dependent_ID>
            <wd:Dep_FirstName>Mahi</wd:Dep_FirstName>
            <wd:Spouse_LastName>Raj</wd:Spouse_LastName>
        </wd:Dependents>
        <wd:Dependents>
            <wd:Dependent_ID>D1256</wd:Dependent_ID>
            <wd:Dep_FirstName>Praveen</wd:Dep_FirstName>
            <wd:Spouse_LastName>Raj</wd:Spouse_LastName>
        </wd:Dependents>
        <wd:Benefits>
            <wd:Coverage>EE + Family</wd:Coverage>
        </wd:Benefits>
    </wd:Report_Entry>
</wd:Report_Data>

我的 XSL 代码

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:wd="urn:com.workday.report/INT_Outbound" version="2.0">

    <xsl:output method="text" indent="no"/> 
    <xsl:strip-space elements="*"/>

        <xsl:variable name="NEWLINE" select="'&#xa;'"/>
        <xsl:variable name="COMMA" select="','"/>
        
    <xsl:template match="/">    

    <xsl:for-each select="wd:Report_Data/wd:Report_Entry/wd:Dependents">
    
            <xsl:value-of select="concat(wd:Report_Data/wd:Employee_ID,$COMMA)"/>           
            <xsl:value-of select="concat(wd:Report_Data/wd:LastName,$COMMA)"/>  
            <xsl:value-of select="concat(wd:Report_Data/wd:FirstName,$COMMA)"/>         
            
            <xsl:value-of select="concat(wd:Dependent_ID,$COMMA)"/> 
            <xsl:value-of select="concat(wd:Spouse_LastName,$COMMA)"/>              
            <xsl:value-of select="wd:Dep_FirstName"/>           
            
          <xsl:value-of select="$NEWLINE"/>
    
    </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

电流输出:

,,,D1245,Raj,Mahi
,,,D1256,Raj,Praveen

预期输出:

12345,Raj,Kiran,D1245,Raj,Mahi
12345,Raj,Kiran,D1246,Raj,Praveen

【问题讨论】:

【参考方案1】:

您的上下文已经是wd:Report_Data/wd:Report_Entry/wd:Dependents,因此您需要返回到wd:Report_Entry(使用..)来获取这些值。

更新的 XSLT...

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:wd="urn:com.workday.report/INT_Outbound" version="2.0">

    <xsl:output method="text" indent="no"/> 
    <xsl:strip-space elements="*"/>

        <xsl:variable name="NEWLINE" select="'&#xa;'"/>
        <xsl:variable name="COMMA" select="','"/>
        
    <xsl:template match="/">    

    <xsl:for-each select="wd:Report_Data/wd:Report_Entry/wd:Dependents">
    
            <xsl:value-of select="concat(../wd:Employee_ID,$COMMA)"/>           
            <xsl:value-of select="concat(../wd:LastName,$COMMA)"/>  
            <xsl:value-of select="concat(../wd:FirstName,$COMMA)"/>         
            
            <xsl:value-of select="concat(wd:Dependent_ID,$COMMA)"/> 
            <xsl:value-of select="concat(wd:Spouse_LastName,$COMMA)"/>              
            <xsl:value-of select="wd:Dep_FirstName"/>           
            
          <xsl:value-of select="$NEWLINE"/>
    
    </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

小提琴:http://xsltfiddle.liberty-development.net/6q1SDk2

【讨论】:

谢谢丹尼尔,你能帮我进行另一项改进吗 - 如何获得如下结果:12345,Raj,Kiran,,, 12345,Raj,Kiran,D1245,Raj,Mahi 12345,Raj, Kiran,D1246,Raj,Praveen 我能够完成两个 for 循环,但只是检查是否有更好的方法。 和另一个 @Pradeep - 您可以进行两个单独的模板匹配,但与使用两个 for-each 相比,它可能不会给您带来任何优势。示例:xsltfiddle.liberty-development.net/6q1SDk2/1

以上是关于我无法从我的 xml 中以 xsl 编码获取子循环中的根节点数据的主要内容,如果未能解决你的问题,请参考以下文章

我无法使用此编码从我的 SD 卡中获取歌曲。我可以这样做还是需要 Content Provider 这样做

需要我的XSLT仅从XML输出特定作者(如果可用)

[C#]在 XMLDocument 中添加 XSL 引用

有没有办法使用 xsl 更改 xml 中元素的名称?

XSL 编码特殊字符 XML 格式正确

在XSL上解析具有相同名称的子元素