Таблица стилей XSLT? Не знаете, как написать? - PullRequest
1 голос
/ 14 декабря 2011

XML:

<tickets>
  <request day="tue">
    <ticket>
       <type>Tech Support</type>
       <cust>9045</cust>
       <status>pending</status>
    <ticket>
    <ticket>
       <type>Account Support</type>
       <cust>3344</cust>
       <status>resolved</status>
    <ticket>
  </request>
  <request day="wed">
    <ticket>
       <type>Tech Support</type>
       <cust>9944</cust>
       <status>new</status>
    <ticket>
    <ticket>
       <type>Billing</type>
       <cust>3344</cust>
       <status>pending</status>
    <ticket>
  </request>
</tickets>

Как мне написать select = "", чтобы он соответствовал всем значениям элемента cust, не повторяя (если их больше 1)?

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Как мне написать select = "", чтобы соответствовать всем значениям элемента cust, не повторяется (если их больше 1)?

Вот полное, короткое и простое (без xsl:for-each и без длинных и нечитаемых строк) Muenchian группировка решение :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:key name="kCustByVal" match="cust" use="."/>

 <xsl:template match=
  "cust
     [generate-id()
     =
      generate-id(key('kCustByVal', .)[1])
     ]
  ">
  <xsl:value-of select="."/><xsl:text> </xsl:text>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному XML-документу (после того, как он был исправлен после многочисленных исправлений):

<tickets>
    <request day="tue">
        <ticket>
            <type>Tech Support</type>
            <cust>9045</cust>
            <status>pending</status>
        </ticket>
        <ticket>
            <type>Account Support</type>
            <cust>3344</cust>
            <status>resolved</status>
        </ticket>
    </request>
    <request day="wed">
        <ticket>
            <type>Tech Support</type>
            <cust>9944</cust>
            <status>new</status>
        </ticket>
        <ticket>
            <type>Billing</type>
            <cust>3344</cust>
            <status>pending</status>
        </ticket>
    </request>
</tickets>

желаемый, правильный результат получается :

9045 3344 9944 
0 голосов
/ 14 декабря 2011

Это то, что вы ищете?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" encoding="UTF-8" indent="yes"/>
    <xsl:key name="cust" match="/tickets/request/ticket/cust/text()" use="."/>
    <xsl:template match="/">
        <xsl:for-each select="/tickets/request/ticket/cust/text()[generate-id()=generate-id(key('cust',.)[1])]">
            <xsl:value-of select="."/>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...