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

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
Xml 使用XSL迭代每个循环中的元素_Xml_Xslt_Xpath_Xslt 1.0 - Fatal编程技术网

Xml 使用XSL迭代每个循环中的元素

Xml 使用XSL迭代每个循环中的元素,xml,xslt,xpath,xslt-1.0,Xml,Xslt,Xpath,Xslt 1.0,因此,我一直在为实现这一目标而努力(我确信这很简单,我对XSL几乎没有经验) 我尝试在xml文档中迭代一组非常不同的子元素,其结构如下: <transaction> <data_xml> <document data_type="0"> <element1>value1</element1> <element2>value2</element2> <element3>value

因此,我一直在为实现这一目标而努力(我确信这很简单,我对XSL几乎没有经验)

我尝试在xml文档中迭代一组非常不同的子元素,其结构如下:

<transaction>
 <data_xml>
  <document data_type="0">
   <element1>value1</element1>
   <element2>value2</element2>
   <element3>value3</element3>
  </document>
 </data_xml>
</transaction>

价值1
价值2
价值3
我使用的是XSL 1.0版,考虑到我工作的系统的限制,我非常确定我不能使用2.0来实现这一点

我想要的输出是:

<foo>
 <bar:element1><!CDATA[[value]]></bar:element1>
 <bar:element2><!CDATA[[value]]></bar:element2>
 <bar:element3><!CDATA[[value]]></bar:element3>
</foo>

我目前使用的可怕代码是:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
 <foo>
  <xsl:for-each select="/transaction/data_xml/document[@data_type='0']/*">
   &lt;bar:<xsl:value-of select="name(name(/transaction/data_xml/document[@data_type='0']/*)"/>>
   &#60;![CDATA[<xsl:value-of select="/transaction/data_xml/document[@data_type='0']/*"/>]]&gt;
   &#60;/bar:<xsl:value-of select="name(/transaction/data_xml/document[@data_type='0']/*)"/>>
  </xsl:for-each>
 </foo>
</xsl:template>
</xsl:stylesheet>

酒吧:>
<![CDATA[]
</酒吧:>
但是,当我使用它时,它只是在同一个元素上迭代多次,而不是依次迭代每个元素

有什么想法吗?除了因为我的代码不好看而向我开枪之外?

还有两件事:

  • 可以使用不带参数的
    name()
    local-name()
    来获取当前元素的名称
  • 您应该使用
    xsl:element
    创建具有动态名称的元素。您不应该手动构建它们的标记:

![CDATA[
]]

产生以下结果:

<foo xmlns:bar="namespaceForBarGoesHere">
  <bar:element1><![CDATA[value1]]></bar:element1>
  <bar:element2><![CDATA[value2]]></bar:element2>
  <bar:element3><![CDATA[value3]]></bar:element3>
</foo>

您可能希望执行以下操作:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:bar="http://example.com/bar">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/">
    <foo>
        <xsl:for-each select="transaction/data_xml/document[@data_type='0']/*">
            <xsl:element name="bar:{local-name()}">
                <xsl:value-of select="."/>
            </xsl:element>
        </xsl:for-each>
    </foo>
</xsl:template>

</xsl:stylesheet>
但是,这要求您事先知道所有可能的元素名称。否则,您必须对其进行破解,例如:

<xsl:template match="/">
    <foo>
        <xsl:for-each select="transaction/data_xml/document[@data_type='0']/*">
            <xsl:element name="bar:{local-name()}">
                <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
                <xsl:value-of select="."/>
                <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
            </xsl:element>
        </xsl:for-each>
    </foo>
</xsl:template>

![CDATA[
]]

您请求的输出不是格式良好的XML文档(
栏:
前缀必须绑定到命名空间)。为什么CDATA值在这三种情况下都是相同的呢?根据我的转换器,XSL也是无效的。因为我是个哑巴,我没有仔细检查。谢谢你的评论!我相信您的CDATA模拟生成的结果不正确。@michael.hor257k我缺少感叹号。现在应该可以工作了。这是一个更好的实现,看起来很好,很有意义!非常感谢。
<?xml version="1.0" encoding="utf-8"?>
<foo xmlns:bar="http://example.com/bar">
   <bar:element1>value1</bar:element1>
   <bar:element2>value2</bar:element2>
   <bar:element3>value3</bar:element3>
</foo>
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" cdata-section-elements="bar:element1 bar:element2 bar:element3"/>
<xsl:template match="/">
    <foo>
        <xsl:for-each select="transaction/data_xml/document[@data_type='0']/*">
            <xsl:element name="bar:{local-name()}">
                <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
                <xsl:value-of select="."/>
                <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
            </xsl:element>
        </xsl:for-each>
    </foo>
</xsl:template>