如何获取XSL中具有属性的元素的值?
这是我用来测试代码的示例。
<CD>
<a/> <!--N0#1-->
<b>text</b> <!--NO#2-->
<c YEAR="value"/> <!--NO#3-->
<d name="value" ou="aous">9.90</d> <!--NO#4-->
<e><f>text</f> <!--NO#5-->
<g>text</g></e>
<i><h>text</h> <!--NO#6-->
<h>text</h></i>
</CD>
我希望这个4号零件能给我这样的输出:
"d" : {
"@name" : "value",
"@ou" : "aous",
"VALUE_VARIABLE":"9.90"
}
我遇到的问题是,我无法获得";9.90〃;要素我该怎么做?这是我的代码:
<xsl:for-each select="@*">
<xsl:choose>
<xsl:when test="position()=last()"> <!--check if current attribute is last-->
"@<xsl:value-of select="name()"/>" : "<xsl:value-of select="."/>"
</xsl:when>
<xsl:when test="./*"> <!--check if current element has child elements-->
"<xsl:value-of select="name()"/>" : "<xsl:value-of select="."/>"
</xsl:when>
<xsl:when test="(./*) and not(position()=last())">
"<xsl:value-of select="name()"/>" : "<xsl:value-of select="."/>",
</xsl:when>
<xsl:otherwise>
"@<xsl:value-of select="name()"/>" : "<xsl:value-of select="."/>",
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
编辑-在这里你可以找到完整的代码。
试试这样的东西:
<xsl:variable name="q">"</xsl:variable>
<xsl:variable name="nl">
</xsl:variable>
<xsl:template match="*[@*]">
<xsl:value select="name()"/>{
<xsl:for-each select="@*">
<xsl:if test="position()!=1">,
</xsl:if>
<xsl:value-of select="concat($q, '@', name(), $q, ' : ', $q, ., $q)"/>
</xsl:for-each>
<xsl:value-of select="concat($q, 'VALUE_VARIABLE', $q, ' : ', $q, ., $q)"/>
</xsl:template>
当您在属性的上下文中时,您可以使用获取其父元素的字符串值
<xsl:value-of select=".."/>
当然,从父元素本身的上下文中获取它要容易得多,例如:
<xsl:template match="d">
<xsl:text>{"d" : {</xsl:text>
<xsl:for-each select="@*">
<xsl:text>"@</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>" : "</xsl:text>
<xsl:value-of select="."/>
<xsl:text>", </xsl:text>
</xsl:for-each>
<xsl:text>"VALUE_VARIABLE" : "</xsl:text>
<xsl:value-of select="."/>
<xsl:text>"}}</xsl:text>
</xsl:template>
p。S.
<xsl:when test="./*">
对于属性永远不会为真。
添加:
如果你想让它更通用,可以尝试以下方法:
<xsl:template match="*[@*]">
<xsl:text>{"</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>" : {</xsl:text>
<xsl:for-each select="@*">
<xsl:text>"@</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>" : "</xsl:text>
<xsl:value-of select="."/>
<xsl:text>"</xsl:text>
<xsl:if test="position()!=last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:if test="text()">
<xsl:text>, "VALUE_VARIABLE" : "</xsl:text>
<xsl:value-of select="."/>
<xsl:text>"</xsl:text>
</xsl:if>
<xsl:text>}}</xsl:text>
<xsl:if test="position()!=last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:template>