1


次のXMLを検討します。

<root>
  <contrib contrib-type="author">
    <name>
      <last-name>Simpson</last-name>
      <first-name>Bart</first-name>
    </name>
  </contrib>

  <contrib contrib-type="author">
    <name>
      <last-name>Zoidberg</last-name>
      <first-name>Dr.</first-name>
    </name>
  </contrib>
</root>

...これらの要素の内容を変換してこの出力を取得するにはどうすればよいですか?

<Authors contrib-type="author">Bart Simpson</Authors>
<Authors contrib-type="author">Dr. Zoidberg</Authors>




<first-name>  の内容を   の内容と連結しようとして  いますが、1つのスペース<last-name> で区切られています

また、のサブ要素は必要ありません  Authors (    可能であれば、、、および要素 <name> を  <first-name> 削除  します)。<last-name>



これは私がこれまでに持っているXSLです(これは機能していません):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>

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

        <!-- Authors -->
        <xsl:template match="contrib[@contrib-type='author']">
            <Authors>
                <xsl:apply-templates select="@*|node()"/>
                <xsl:value-of select = "concat(given-names, surname)" />
            </Authors>
        </xsl:template>

</xsl:stylesheet>


<contrib>  これまでのところ、要素を   に変換することはできますが  <Authors> 、そのサブ要素を連結または削除することはできません。

4

3 に答える 3

2

これと同じくらい簡単なことを試してください:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
    <root>
        <xsl:apply-templates select="/root/contrib"/>
    </root>
</xsl:template>
<!-- Authors -->
<xsl:template match="contrib[@contrib-type='author']">
    <Authors>
        <xsl:copy-of select="@*"/>
        <xsl:value-of select="name/first-name"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="name/last-name"/>
    </Authors>
</xsl:template>
</xsl:stylesheet>
于 2012-08-08T15:09:42.757 に答える
1

要点を見逃していない限り、作成者テンプレートを次のように変更すると機能するはずです。

<!-- Authors -->
<xsl:template match="contrib[@contrib-type='author']">
    <Authors>
        <xsl:apply-templates select="@*"/>
        <xsl:value-of select = "concat(normalize-space(name/first-name/text()), 
                                       ' ', 
                                       normalize-space(name/last-name/text()))" />
    </Authors>
</xsl:template>

出力:

<root>
  <Authors contrib-type="author">Bart Simpson</Authors>
  <Authors contrib-type="author">Dr. Zoidberg</Authors>
</root>
于 2012-08-08T15:14:08.383 に答える
1

これを試してみてください:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>

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

        <!-- Authors -->
        <xsl:template match="contrib[@contrib-type='author']">
            <Authors contrib-type="{@contrib-type}">
                <xsl:value-of select = "concat(name/first-name, ' ', name/last-name)" />
            </Authors>
        </xsl:template>

</xsl:stylesheet>

これがお役に立てば幸いです

于 2012-08-08T15:14:14.917 に答える