XSLT преобразовывает значение элемента в дочернее значение - PullRequest
0 голосов
/ 18 июля 2009

Мой XML выглядит так:

<element>
  <AttrValue someatt="a">
    <StyledElement>
      <Container />
      <StyledElement>
        <Paragraph />
        <StyledElement>
          <PlainText someValue="some Text" />
        </StyledElement>
      </StyledElement>
      <StyledElement>
        <Paragraph />
        <StyledElement>
          <PlainText TextValue="another Text" />
        </StyledElement>
      </StyledElement>
    </StyledElement>
  </AttrValue>
</element>

Вывод должен выглядеть следующим образом:

<element>
    <AttrValue someatt="a"> some Text , another Text (text from child nodes - seperated by comma) </AttrValue>
</element>

У меня есть несколько таких элементов, поэтому, может быть, это должно быть с for-each?

Ответы [ 2 ]

1 голос
/ 20 июля 2009

<xsl:for-each> для этого не нужно. Я рекомендую отдельные шаблоны в качестве более удобочитаемой альтернативы:

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

  <xsl:template match="element">
    <xsl:copy>
      <xsl:apply-templates select="AttrValue" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="AttrValue">
    <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:apply-templates select=".//PlainText/@*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="PlainText/@*">
    <xsl:value-of select="." />
    <xsl:if test="position() &lt; last()">, </xsl:if>
  </xsl:template>

</xsl:stylesheet>

Вывод с вашим исходным XML:

<element>
  <AttrValue someatt="a">some Text, another Text</AttrValue>
</element>
0 голосов
/ 19 июля 2009

Я предположил, что атрибут TextValue вашего второго элемента <PlainText> неправильно введен и фактически является атрибутом someValue.

Вот некоторый XSLT, который должен делать эту работу:

<xsl:template match="/element">
  <element>
    <xsl:for-each select="AttrValue">
      <AttrValue someatt="{@someatt}">
        <xsl:for-each select="//PlainText">
          <xsl:if test="position() != 0">, </xsl:if>
          <xsl:value-of select="@someValue"/>
        </xsl:for-each>
      </AttrValue>
    </xsl:for-each>
  </element>
</xsl:template>

Это в основном вложенный цикл <xsl:for-each>. Единственная хитрость - это то, как position() используется для размещения запятых между текстовыми значениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...