如何为XML中的每个属性创建Xpaths

时间:2019-03-21 08:55:22

标签: java xml xslt xpath

我有一个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()]

任何帮助都是一个很好的选择

1 个答案:

答案 0 :(得分:0)

您可以检查

 <xsl:template match="text()[normalize-space() ne '']">
    <xsl:text>&#xa;</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>

检查输出 https://xsltfiddle.liberty-development.net/94rmq6a