2017-06-14 77 views
1

我提出一个表,其中的标题名称是从元件,并从属性的reportdata元件获得的数据。但是,我不知道属性的名称:Value1,Value2,等..提前。生成属性的名称并将其存储在报告节点内的元素内部的FieldName属性中。的XPath如何创建的属性的路径动态

我一直没能找到一种方法,使使用生成的FIELDNAMESreportdata获得对应的属性值的XPath。有任何想法吗?或者这是不可能的。

以下是XML:

<report> 
    <reportparameters> 
     <header Order="1" HeaderName="Day_1" /> 
     <header Order="2" HeaderName="Day_2" /> 
     <header Order="3" HeaderName="Day_3" /> 
     <header Order="4" HeaderName="Total" /> 

     <reportnode ColumnCount="4"> 
      <column Order="1" FieldName="Value1" /> 
      <column Order="2" FieldName="Value2" /> 
      <column Order="3" FieldName="Value3" /> 
      <column Order="4" FieldName="TotalValue" /> 
     </reportnode> 
    </reportparameters> 

    <reportdata Value1="0" Value2="0" Value3="0" TotalValue="0"/> 
    <reportdata Value1="0" Value2="0" Value3="0" TotalValue="0"/> 
    <reportdata Value1="0" Value2="0" Value3="0" TotalValue="0"/> 
    <reportdata Value1="0" Value2="0" Value3="0" TotalValue="0"/> 
    <reportdata Value1="0" Value2="0" Value3="0" TotalValue="0"/> 
</report> 

的XSL尝试:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="no"/> 
    <xsl:template match="/"> 
     <report>  
      <row> 
       <xsl:for-each select="/report/reportparameters/header"> 
        <xsl:variable name="columnCounter" select="position()"/> 
        <xsl:element name="{./@HeaderName}"> 
        <xsl:for-each select="/report/reportdata"> 
         <xsl:value-of select="@{../reportparameters/reportnode/column[@Order=$columnCounter+1]/@FieldName}"/> 
        </xsl:for-each> 
        </xsl:element> 
       </xsl:for-each> 
      </row> 
     </report> 
    </xsl:template> 
</xsl:stylesheet> 
+2

什么是你正在试图将结果呢?请使用不同的单元格值,以便我们可以了解转换的逻辑。 –

+0

@ michael.hor257k我一定会确保下次发布我想要的结果。幸运的是,如果没有它,你仍然能够帮助我! – FreakinRocket

回答

2

我怀疑你可以简单地做:

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:template match="/report"> 
    <xsl:variable name="cols" select="reportparameters/reportnode/column" /> 
    <report> 
     <xsl:for-each select="reportdata"> 
      <row> 
       <xsl:for-each select="@*"> 
        <xsl:variable name="i" select="position()"/> 
        <xsl:element name="{$cols[$i]/@FieldName}"> 
         <xsl:value-of select="."/> 
        </xsl:element> 
       </xsl:for-each> 
      </row> 
     </xsl:for-each> 
    </report> 
</xsl:template> 

</xsl:stylesheet> 

获得:

<?xml version="1.0" encoding="UTF-8"?> 
<report> 
    <row> 
    <Value1>0</Value1> 
    <Value2>0</Value2> 
    <Value3>0</Value3> 
    <TotalValue>0</TotalValue> 
    </row> 
    <row> 
    <Value1>0</Value1> 
    <Value2>0</Value2> 
    <Value3>0</Value3> 
    <TotalValue>0</TotalValue> 
    </row> 
    <row> 
    <Value1>0</Value1> 
    <Value2>0</Value2> 
    <Value3>0</Value3> 
    <TotalValue>0</TotalValue> 
    </row> 
    <row> 
    <Value1>0</Value1> 
    <Value2>0</Value2> 
    <Value3>0</Value3> 
    <TotalValue>0</TotalValue> 
    </row> 
    <row> 
    <Value1>0</Value1> 
    <Value2>0</Value2> 
    <Value3>0</Value3> 
    <TotalValue>0</TotalValue> 
    </row> 
</report> 

这是假设每reportdata具有相同的属性,以相同的顺序,对应于reportnodecolumn元素的顺序。否则它会变得稍微复杂一些。

OTOH,如果 - 在您的示例所示 - 的reportdata属性具有所需的名称,它可以更简单:

+0

第一个解决方案运行良好,但您的第二个解决方案让我思考为什么我没有以这种方式格式化我的xml。我对构建XML的方式做了一些更改,以便更直观,现在我可以使用第二种解决方案。非常感谢! – FreakinRocket