我正在制作一个表,其中表头名称来自表头元素,而数据是从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/