Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用XSLT中第二个xml输入的变量修改一个xml输入?_Xslt_Xslt 2.0 - Fatal编程技术网

如何使用XSLT中第二个xml输入的变量修改一个xml输入?

如何使用XSLT中第二个xml输入的变量修改一个xml输入?,xslt,xslt-2.0,Xslt,Xslt 2.0,我的问题是如何基于sample2.xml中的值更改sample1.xml中的值 sample1.xml 1. 红色 2. 蓝色 3. 绿色> 示例2.xml 1. 黄色的 3. 白色 预期产量 1. 黄色的 2. 蓝色 3. 白色> 我只知道如何将整个sample1.xml复制到输出,但我不知道如何记住sample2.xml中的ID,并且通过这些值对sample1进行更改。 不知道是否可能,但可能我必须以某种未知的方式使用变量 这是我的密码: <?xml version=&qu

我的问题是如何基于sample2.xml中的值更改sample1.xml中的值

sample1.xml

1.
红色
2.
蓝色
3.
绿色>
示例2.xml

1.
黄色的
3.
白色
预期产量

1.
黄色的
2.
蓝色
3.
白色>
我只知道如何将整个sample1.xml复制到输出,但我不知道如何记住sample2.xml中的ID,并且通过这些值对sample1进行更改。 不知道是否可能,但可能我必须以某种未知的方式使用变量

这是我的密码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs" xmlns:saxon="http://saxon.sf.net/" extension-element-prefixes="saxon"
version="2.0">

    <xsl:output method="xml" indent="yes" media-type="text/xml" />
   
    <xsl:param name="sample1"/>
    <xsl:param name="sample1_xml" select="saxon:parse($sample1)"/>

    <xsl:param name="sample2"/>
    <xsl:param name="sample2_xml" select="saxon:parse($sample2)"/>

    <xsl:template match="/" name="initial">
        <xsl:apply-templates select="$sample1_xml/node()"/> <!-- this is only for copying entire sample1 file -->

    </xsl:template>

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

    </xsl:template>
</xsl:stylesheet>

我真的不知道什么是正确的方法,因为我是XSLT2.0新手。任何帮助都将不胜感激。

定义一个键
,然后添加一个模板

<xsl:template match="item[key('id', id, $sample2_xml)]/color">
  <xsl:copy-of select="key('id', ../id, $sample2_xml)/color"/>
</xsl:template>

所以完整的样本是

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs saxon"
    xmlns:saxon="http://saxon.sf.net/"
    version="2.0">

    <xsl:output method="xml" indent="yes" media-type="text/xml" />

    <xsl:param name="sample1" as="xs:string"><![CDATA[<root>
    <item>
        <id>1</id>
        <color>red</color>
    </item>
    <item>
        <id>2</id>
        <color>blue</color>
    </item>
    <item>
        <id>3</id>
        <color>green></color>
    </item>
</root>]]></xsl:param>
    <xsl:param name="sample1_xml" select="saxon:parse($sample1)"/>

    <xsl:param name="sample2" as="xs:string"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<root>
   <item>
      <id>1</id>
      <color>yellow</color>
   </item>
   <item>
      <id>3</id>
      <color>white</color>
   </item>
</root>]]></xsl:param>


    <xsl:param name="sample2_xml" select="saxon:parse($sample2)"/>

    <xsl:key name="id" match="item" use="id"/>

    <xsl:template match="/" name="initial">
        <xsl:apply-templates select="$sample1_xml/node()"/> <!-- this is only for copying entire sample1 file -->

    </xsl:template>

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

    </xsl:template>

    <xsl:template match="item[key('id', id, $sample2_xml)]/color">
        <xsl:copy-of select="key('id', ../id, $sample2_xml)/color"/>
    </xsl:template>

</xsl:stylesheet>

1.
红色
2.
蓝色
3.
绿色>
]]>
1.
黄色的
3.
白色
]]>
定义一个键
,然后添加一个模板

<xsl:template match="item[key('id', id, $sample2_xml)]/color">
  <xsl:copy-of select="key('id', ../id, $sample2_xml)/color"/>
</xsl:template>

所以完整的样本是

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs saxon"
    xmlns:saxon="http://saxon.sf.net/"
    version="2.0">

    <xsl:output method="xml" indent="yes" media-type="text/xml" />

    <xsl:param name="sample1" as="xs:string"><![CDATA[<root>
    <item>
        <id>1</id>
        <color>red</color>
    </item>
    <item>
        <id>2</id>
        <color>blue</color>
    </item>
    <item>
        <id>3</id>
        <color>green></color>
    </item>
</root>]]></xsl:param>
    <xsl:param name="sample1_xml" select="saxon:parse($sample1)"/>

    <xsl:param name="sample2" as="xs:string"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<root>
   <item>
      <id>1</id>
      <color>yellow</color>
   </item>
   <item>
      <id>3</id>
      <color>white</color>
   </item>
</root>]]></xsl:param>


    <xsl:param name="sample2_xml" select="saxon:parse($sample2)"/>

    <xsl:key name="id" match="item" use="id"/>

    <xsl:template match="/" name="initial">
        <xsl:apply-templates select="$sample1_xml/node()"/> <!-- this is only for copying entire sample1 file -->

    </xsl:template>

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

    </xsl:template>

    <xsl:template match="item[key('id', id, $sample2_xml)]/color">
        <xsl:copy-of select="key('id', ../id, $sample2_xml)/color"/>
    </xsl:template>

</xsl:stylesheet>

1.
红色
2.
蓝色
3.
绿色>
]]>
1.
黄色的
3.
白色
]]>

我被Martin Honnen打败了,但我的解决方案是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            exclude-result-prefixes="xs" xmlns:saxon="http://saxon.sf.net/" extension-element-prefixes="saxon"
            version="2.0">

<xsl:output method="xml" indent="yes" media-type="text/xml"/>

<xsl:param name="sample1"/>
<xsl:param name="sample1_xml" select="saxon:parse($sample1)"/>

<xsl:param name="sample2"/>
<xsl:param name="sample2_xml" select="saxon:parse($sample2)"/>

<xsl:template match="/" name="initial">
    <xsl:apply-templates select="$sample1_xml/node()"/>
    <!-- this is only for copying entire sample1 file -->

</xsl:template>

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

<xsl:template match="/root/item/color">
    <xsl:param name="id" select="parent::item/id/text()"/>
    <xsl:copy>
        <xsl:choose>
            <xsl:when test="$sample2_xml/root/item[id=$id]/color">
                <xsl:value-of select="$sample2_xml/root/item[id=$id]/color/text()"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="text()"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>


我被Martin Honnen打败了,但我的解决方案是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            exclude-result-prefixes="xs" xmlns:saxon="http://saxon.sf.net/" extension-element-prefixes="saxon"
            version="2.0">

<xsl:output method="xml" indent="yes" media-type="text/xml"/>

<xsl:param name="sample1"/>
<xsl:param name="sample1_xml" select="saxon:parse($sample1)"/>

<xsl:param name="sample2"/>
<xsl:param name="sample2_xml" select="saxon:parse($sample2)"/>

<xsl:template match="/" name="initial">
    <xsl:apply-templates select="$sample1_xml/node()"/>
    <!-- this is only for copying entire sample1 file -->

</xsl:template>

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

<xsl:template match="/root/item/color">
    <xsl:param name="id" select="parent::item/id/text()"/>
    <xsl:copy>
        <xsl:choose>
            <xsl:when test="$sample2_xml/root/item[id=$id]/color">
                <xsl:value-of select="$sample2_xml/root/item[id=$id]/color/text()"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="text()"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>


非常感谢您的快速回复!您能描述一下如何定义键,以及如果标记没有相同的名称,如何在模板中匹配它吗?我对如何定义键和匹配键感到困惑。如果将sample2中的“”重命名为“”,并将sample2中的“”重命名为“new_color”,则无法获得良好的结果。提前感谢好的,我已经为密钥提供了一个示例,很明显,如果您更改第二个文件的格式,那么您需要将密钥调整为
,将模板调整为
。非常感谢您的快速回答!您能描述一下如何定义键,以及如果标记没有相同的名称,如何在模板中匹配它吗?我对如何定义键和匹配键感到困惑。如果将sample2中的“”重命名为“”,并将sample2中的“”重命名为“new_color”,则无法获得良好的结果。提前感谢。我已经为密钥提供了一个示例,显然,如果更改第二个文件的格式,则需要将密钥调整为
,将模板调整为