Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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
通过匹配输入文件和访问文件中的属性值,写入通过document()访问的xml文件中的值_Xml_Xslt_Xpath - Fatal编程技术网

通过匹配输入文件和访问文件中的属性值,写入通过document()访问的xml文件中的值

通过匹配输入文件和访问文件中的属性值,写入通过document()访问的xml文件中的值,xml,xslt,xpath,Xml,Xslt,Xpath,我是XSLT的新手,我正在尝试完成以下工作: 输入文件如下所示: <?xml version="1.0" encoding="UTF-8"?> <root> <para> Some text <frag id="1"/> Some text <frag id="2"/> Some text <frag id="3"/> </para> </roo

我是XSLT的新手,我正在尝试完成以下工作:

输入文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <para>
    Some text
    <frag id="1"/> 
    Some text 
    <frag id="2"/> 
    Some text
    <frag id="3"/>
  </para>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
     <frag id="1">X</frag>
     <frag id="2">Y</frag>
     <frag id="3">Z</frag>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <para>
    Some text
    X 
    Some text 
    Y
    Some text
    Z
  </para>
</root>

一些文本
一些文本
一些文本
元素应替换为另一个文件中相应元素的值,该文件可使用样式表中的document()函数访问

通过document()访问的文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <para>
    Some text
    <frag id="1"/> 
    Some text 
    <frag id="2"/> 
    Some text
    <frag id="3"/>
  </para>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
     <frag id="1">X</frag>
     <frag id="2">Y</frag>
     <frag id="3">Z</frag>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <para>
    Some text
    X 
    Some text 
    Y
    Some text
    Z
  </para>
</root>

X
Y
Z
结果应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <para>
    Some text
    <frag id="1"/> 
    Some text 
    <frag id="2"/> 
    Some text
    <frag id="3"/>
  </para>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
     <frag id="1">X</frag>
     <frag id="2">Y</frag>
     <frag id="3">Z</frag>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <para>
    Some text
    X 
    Some text 
    Y
    Some text
    Z
  </para>
</root>

一些文本
X
一些文本
Y
一些文本
Z
我尝试了许多xpath表达式的变体、循环组合和if语句等。 下面的XSL就是其中一个变体,它产生了最接近预期结果的输出

<?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" version="2.0">
  <xsl:template match="frag">   

     <xsl:for-each select="document('frag.xml')/root/frag/@id = frag/@id">

       <xsl:value-of select="document('frag.xml')/root/frag"/>

     </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

此XSLT在输入文件中的每个
处写入frag.xml的所有元素值。 我的问题是,在测试相等的属性值之后,我不知道如何选择相应的元素值。
我希望有人能帮助我

我无法让它完美工作-现在没有XML编辑器,也没有像
document()
这样的在线编辑器调用,但这正是您需要的东西

第一个模板是,当您希望“保留大部分输入文件,但只更改一些小部分”时,它始终是一个手动基本情况

第二个转换匹配输入文档上的
frag
节点,然后用
frag.xml
文件中的相应节点替换它们

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

  <xsl:template match="frag">
    <xsl:variable name='id' select="@id"/>
    <xsl:value-of select="document('frag.xml')//frag[@id=$id]"/>
  </xsl:template>
</xsl:stylesheet>

这项功能非常有效!最好的是我学到了一些新的东西。身份转换。非常感谢你。