xml - XPath如何动态创建属性的路径

标签 xml xslt xpath xslt-1.0

我正在制作一个表,其中表头名称来自表头元素,而数据是从reportdata元素的属性获取的。但是,我不知道这些属性的名称:Value1,Value2等。生成属性名称,并将其存储到ReportName内部列元素内部的FieldName属性中。

我还没有找到一种方法来制作XPath,该方法使用生成的FieldNames并从reportdata获取相应的属性值。有任何想法吗?或者这是不可能的。

以下是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>

最佳答案

我怀疑您可以简单地做到:

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具有相同的属性,并且具有相同的顺序,与column中的reportnode元素的顺序相对应。否则,它会变得稍微复杂一些。

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

<xsl:template match="/report">
    <report> 
        <xsl:for-each select="reportdata">
            <row>
                <xsl:for-each select="@*">
                    <xsl:element name="{name()}">
                        <xsl:value-of select="."/>
                    </xsl:element>
                </xsl:for-each>
            </row>
        </xsl:for-each>
    </report>
</xsl:template>

关于xml - XPath如何动态创建属性的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44556043/

相关文章:

Python lxml XPath 语法错误 : invalid predicate

xml - 为什么固定宽度的文件格式仍在使用?

android - 带标题和子标题的抽屉导航菜单项

java - 是否可以从 Android 上的 Xalan 调用 Java 扩展函数?

python - Selenium 找不到元素

java - Servlet 初始化内部的 Init 过滤器

c - go 中的 xslt 支持

java - xml java xslt 标签

xml - 当节点文本包含时xPath获取兄弟节点

html - 文本的 XPath 不起作用