我有一些看起来像这样的xml:
<row>
<anode myattr1="value1" anotherAttr="notthis">
blah
</anode>
<anothernode myattr1="value1" myattr2="value2" anotherAttr="notthis">
blahBlah
</anothernode>
</row>
我想变成这样的事情:
<tr>
<td title="value1">
blah
</td>
<td title="value1\nvalue2">
blahBlah
</td>
</tr>
所以我试图使用“fn:starts-with”来选择这些属性值,但是效果不好。这就是我到目前为止所做的:
<xsl:for-each select="row">
<tr>
<xsl:for-each select="./*">
<xsl:variable name="title">
<xsl:for-each select="./@[fn:starts-with(name(),'myattr')]">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:variable>
<td title="$title"><xsl:value-of select="."/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
但是当我运行它时我得到一个例外。任何帮助将不胜感激。
答案 0 :(得分:2)
简短的转型:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="row/*">
<td>
<xsl:apply-templates select="@*[starts-with(name(),'myattr')][1]"/>
<xsl:value-of select="."/>
</td>
</xsl:template>
<xsl:template match="@*[starts-with(name(),'myattr')][1]">
<xsl:attribute name="title">
<xsl:value-of select="."/>
<xsl:apply-templates select=
"../@*[starts-with(name(),'myattr')][position()>1]"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="@*[starts-with(name(),'myattr')][position()>1]">
<xsl:value-of select="concat('\n', .)"/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档时:
<row>
<anode anotherAttr="notthis" myattr1="value1" >
blah
</anode>
<anothernode anotherAttr="notthis" myattr1="value1" myattr2="value2" >
blahBlah
</anothernode>
</row>
产生了想要的正确结果:
<tr>
<td title="value1">
blah
</td>
<td title="value1\nvalue2">
blahBlah
</td>
</tr>
答案 1 :(得分:1)
只需要调整一些事情就可以开始......
<xsl:for-each select="row">
<tr>
<xsl:for-each select="./*">
<xsl:variable name="title">
<!-- Added * after @ -->
<xsl:for-each select="./@*[starts-with(name(),'myattr')]">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:variable>
<!-- Added {} for AVT -->
<td title="{$title}"><xsl:value-of select="."/></td>
</xsl:for-each>
</tr>
</xsl:for-each>