3

私はxml文書を持っています

 <body>
      <heading>Main Heading</heading>
      <para>
       <text>para 1</text>
      </para>
      <para>
        <heading>heading 2</heading>
        <text> para 2</text>
      </para>
      <para>
         <heading>heading 3</heading>
         <text>para 3</text>
       </para>
    </body>

見出し要素の最初の出現に一致させ、それにテキストを追加したいと思います。見出しの最初の出現が必要であり、見出しはパラ要素の子ノードである必要があります。

したがって、出力は以下のようになります

 <body>
      <heading>Main Heading</heading>
      <para>
       <text>para 1</text>
      </para>
     <para>
        <heading>**This is a first heading found** heading 2</heading>
        <text> para 2</text>
      </para>
     <para>
    <heading>heading 3</heading>
        <text>para 3</text>
      </para>
    </body>
4

2 に答える 2

6

これはあなたが望むことをするはずです:

para[heading][1]/heading[1]

これは、最初の para-that-c​​ontains-any-headings 内の最初の見出し要素と一致します。

XSLT の例:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
  </xsl:template>

  <xsl:template match="para[heading][1]/heading[1]">
    <xsl:copy>**First heading** <xsl:apply-templates select="@*|node()" /></xsl:copy>
  </xsl:template>
</xsl:stylesheet>

あなたの例での出力:

<body>
      <heading>Main Heading</heading>
      <para>
       <text>para 1</text>
      </para>
      <para>
        <heading>**First heading** heading 2</heading>
        <text> para 2</text>
      </para>
      <para>
         <heading>heading 3</heading>
         <text>para 3</text>
       </para>
    </body>

<para>XML のすぐ下にネストされている以外の場所に要素が存在する可能性がある場合<body>は、より具体的な一致式を使用する方が安全です。つまり、

/body/para[heading][1]/heading[1]
于 2013-03-28T16:37:28.523 に答える
0

最初は の子であるため、position()を使用する必要があります。para は、子が呼び出される前に1回発生するため、2番目のが必要です。para<heading><para><heading><para>

この XSLT を適用します。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:template match="node() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="//para[position()=2]/heading">
    <xsl:element name="heading">
        <xsl:value-of select="concat('**This is a first heading found**',' ',.)"/>
    </xsl:element>
</xsl:template>


</xsl:stylesheet>

ソース XML に追加すると、次の出力が得られます。

<?xml version="1.0" encoding="UTF-8"?>
<body>
<heading>Main Heading</heading>
<para>
    <text>para 1</text>
</para>
<para>
    <heading>**This is a first heading found** heading 2</heading>
    <text> para 2</text>
</para>
<para>
    <heading>heading 3</heading>
    <text>para 3</text>
</para>
</body>

PS: あなたが XSLT 2.0 を必要としていることに気付きました - 私の解決策は XSLT 1.0 です。違いがあるかどうかはわかりません。

于 2013-03-28T16:27:02.430 に答える