Использование XPath в XSL для выбора всех значений атрибутов узла с именем атрибута, начинающимся с заданной строки - PullRequest
2 голосов
/ 24 мая 2011

У меня есть некоторый 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:начинается с ", чтобы выбрать эти значения атрибута, но не совсем работает.Это то, что у меня есть:

<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>

Но я получаю исключение, когда запускаю это.Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

Короткое и простое преобразование :

<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 голос
/ 24 мая 2011

Просто нужно настроить пару вещей, чтобы вы начали ...

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...