xsltproc генерирует больше результатов, чем ожидалось - PullRequest
2 голосов
/ 23 ноября 2011

Я пытаюсь написать простой .xslt для обработки .xml файлов.Но я запутался - почему текст в тегах <tag>text</tag> также был напечатан?Пожалуйста посмотрите на пример:

sample.xml

<source>
    <employee>
        <firstName>Joe</firstName>
        <surname>Smith</surname>
    </employee>
</source>

style.xsl

<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="surname">
    <div>
        <xsl:value-of select="name()"/>
    </div>
</xsl:template>
</xsl:stylesheet>

Почему послезвонит: xsltproc style.xslt sample.xml Я получаю

Joe
<div>surname</div>

вместо

<div>surname</div>

только?

Ответы [ 2 ]

4 голосов
/ 23 ноября 2011

Это потому, что Joe обрабатывается по умолчанию .Текстовые узлы обычно выводятся по умолчанию.Вам необходимо переопределить поведение по умолчанию.

<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

  <!--Added to match all other nodes/attributes.-->
  <xsl:template match="node()|@*">
    <xsl:apply-templates select="node()|@*"/>
  </xsl:template>

  <xsl:template match="surname">
    <div>
      <xsl:value-of select="name()"/>
    </div>
  </xsl:template>

</xsl:stylesheet>
2 голосов
/ 23 ноября 2011

Обработка начинается с узла документа, и есть встроенные шаблоны , которые продолжают обработку, пока ваши шаблоны не совпадут. У вас уже есть одно предложение переопределить шаблоны по умолчанию, другой подход в вашем случае может заключаться в том, чтобы явно выбирать только элементы фамилии для обработки, например,

<xsl:template match="/">
  <xsl:apply-templates select="source/employee/surname"/>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...