3

次のような XML があるとします。

<Component Id="cmp25217AE65B163B199EDDA7F29198730A" Guid="{DEB29383-8BF1-4FD0-830B-DF8639F4069A}">
<Component Id="cmp93E1B1FFA5A62A43251E23BD65FBAA66" Guid="{76E8B8CE-835D-498E-9330-CE940C9510BF}">
<Component Id="cmp3D7B898C57056B0E87C3A964112BB9D6" Guid="{3BA9A892-C44F-4B2E-B0B9-B732120D35DB}">

XSLT を使用して、次のように各要素の最後に「Win64="yes"」を追加するにはどうすればよいですか。

<Component Id="cmp25217AE65B163B199EDDA7F29198730A" Guid="{DEB29383-8BF1-4FD0-830B-DF8639F4069A}" Win64="yes">
<Component Id="cmp93E1B1FFA5A62A43251E23BD65FBAA66" Guid="{76E8B8CE-835D-498E-9330-CE940C9510BF}" Win64="yes">
<Component Id="cmp3D7B898C57056B0E87C3A964112BB9D6" Guid="{3BA9A892-C44F-4B2E-B0B9-B732120D35DB}" Win64="yes">
4

3 に答える 3

2

要素を使用して、<xsl:attribute>要素 (内部) に直接適用できます<xsl:copy>

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

更新: Xml コンテンツをコピーする XSLT に埋め込まれている場合、次のようになります。

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

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

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

</xsl:stylesheet>

更新 2:これは、要素にのみ追加Win64="yes"することを前提としています。<Component>そうでない場合は、match追加の属性を挿入するテンプレートの属性の XPath 式を調整する必要があります。

更新 3:整形式の入力および出力ドキュメント:

これを入力ドキュメントとして想定します。

<?xml version="1.0" encoding="UTF-8"?>
<xml>
    <Component Id="cmp25217AE65B163B199EDDA7F29198730A" Guid="{DEB29383-8BF1-4FD0-830B-DF8639F4069A}"/>
    <Component Id="cmp93E1B1FFA5A62A43251E23BD65FBAA66" Guid="{76E8B8CE-835D-498E-9330-CE940C9510BF}"/>
    <Component Id="cmp3D7B898C57056B0E87C3A964112BB9D6" Guid="{3BA9A892-C44F-4B2E-B0B9-B732120D35DB}"/>
</xml>

次に、前述の XSLT の出力は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<xml>
  <Component Win64="yes" Id="cmp25217AE65B163B199EDDA7F29198730A" Guid="{DEB29383-8BF1-4FD0-830B-DF8639F4069A}" />
  <Component Win64="yes" Id="cmp93E1B1FFA5A62A43251E23BD65FBAA66" Guid="{76E8B8CE-835D-498E-9330-CE940C9510BF}" />
  <Component Win64="yes" Id="cmp3D7B898C57056B0E87C3A964112BB9D6" Guid="{3BA9A892-C44F-4B2E-B0B9-B732120D35DB}" />
</xml>
于 2012-06-28T22:06:56.200 に答える
0

このスタイルシートは、要求したようにすべての要素に属性を追加します。属性の位置が最後にない場合もありますが、それは問題ではないことに注意してください。

XML入力(整形式)

<doc>
    <Component Id="cmp25217AE65B163B199EDDA7F29198730A" Guid="{DEB29383-8BF1-4FD0-830B-DF8639F4069A}"/>
    <Component Id="cmp93E1B1FFA5A62A43251E23BD65FBAA66" Guid="{76E8B8CE-835D-498E-9330-CE940C9510BF}"/>
    <Component Id="cmp3D7B898C57056B0E87C3A964112BB9D6" Guid="{3BA9A892-C44F-4B2E-B0B9-B732120D35DB}"/>
</doc>

XSLT 1.0(XalanおよびSaxon 6.5.5でテスト済み)

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

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

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

</xsl:stylesheet>

出力

<doc Win64="yes">
   <Component Win64="yes" Id="cmp25217AE65B163B199EDDA7F29198730A" Guid="{DEB29383-8BF1-4FD0-830B-DF8639F4069A}"/>
   <Component Win64="yes" Id="cmp93E1B1FFA5A62A43251E23BD65FBAA66" Guid="{76E8B8CE-835D-498E-9330-CE940C9510BF}"/>
   <Component Win64="yes" Id="cmp3D7B898C57056B0E87C3A964112BB9D6" Guid="{3BA9A892-C44F-4B2E-B0B9-B732120D35DB}"/>
</doc>
于 2012-06-28T23:29:25.320 に答える
-1

<xsl:copy>残念ながら、属性を使用および追加することはできません。私はこのようにしました:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"     xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/root">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="Component">
            <xsl:element name="Component">
                <xsl:attribute name="Id" select="@Id"/>
                <xsl:attribute name="Guid" select="@Guid"/>
                <xsl:attribute name="Win64" select="'yes'"/>
            </xsl:element>
    </xsl:template>
</xsl:stylesheet>
于 2012-06-28T22:12:50.833 に答える