我有一个XML文件,我想使用Java或XSLT为XML文件中的每个属性创建xpath。
示例XML-
<host>
<node>
<type>fruit1</type>
<value>10</value>
</node>
<node>
<type>fruit2</type>
<value>20</value>
</node>
<node>
<type>fruit3</type>
<value xsi:type="valueList">
<listValues>
<value>
<value>30</value>
<code>abc</code>
</value>
</listValues>
</value>
</node>
<node>
<type>fruit4</type>
<value>40</value>
</node>
<node>
<type>fruit5</type>
<value>50</value>
</node>
</host>
预期输出为-
host/node[1]/type[text()]
host/node[1]/value[text()]
host/node[2]/type[text()]
host/node[2]/value[text()]
host/node[3]/type[text()]
host/node[3]/value[@type = "valueList"]/listValues/value/value[text()]
host/node[3]/value[@type = "valueList"]/listValues/value/code[text()]
host/node[4]/type[text()]
host/node[4]/value[text()]
host/node[5]/type[text()]
host/node[5]/value[text()]
任何帮助都是一个很好的选择
答案 0 :(得分:0)
您可以检查
<xsl:template match="text()[normalize-space() ne '']">
<xsl:text>
</xsl:text>
<xsl:for-each select="ancestor::*">
<xsl:value-of select="local-name()"/>
<xsl:if test="following-sibling::*[local-name() = current()/local-name()] or preceding-sibling::*[local-name() = current()/local-name()]"><xsl:value-of select="concat('[', count(preceding-sibling::*[local-name() = current()/local-name()]) + 1 ,']')"></xsl:value-of></xsl:if>
<xsl:for-each select="@*">
<xsl:text>[@</xsl:text><xsl:value-of select="local-name(.)"/><xsl:text> = "</xsl:text><xsl:value-of select="."></xsl:value-of><xsl:text>"]</xsl:text>
</xsl:for-each>
<xsl:if test="position() ne last()">/</xsl:if>
<xsl:if test="position() eq last()"><xsl:text>[text()]</xsl:text></xsl:if>
</xsl:for-each>
</xsl:template>