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标识转换而不更改输出_Xslt_Xslt 1.0 - Fatal编程技术网

XSLT标识转换而不更改输出

XSLT标识转换而不更改输出,xslt,xslt-1.0,Xslt,Xslt 1.0,在源代码完全没有更改的情况下,是否可以进行xslt标识转换 当我使用以下模板时,输出中的ident和linebreak会发生更改,我不想对源xml做任何更改 XSLT 输入 输出 一般来说,不可能百分之百地确信所有内容都会保持不变,因为xslt数据模型并没有保存解析过程中的所有信息。例如,如果输入包含&x3C;然后输出可能包含。类似地,CDATA节也不会保留—相邻的文本节点CDATA节和正常文本模式在解析时合并为一个,虽然您可以配置处理器对某些元素的内容使用CDATA,但您不能简单地将它们保留原

在源代码完全没有更改的情况下,是否可以进行xslt标识转换

当我使用以下模板时,输出中的ident和linebreak会发生更改,我不想对源xml做任何更改

XSLT

输入

输出


一般来说,不可能百分之百地确信所有内容都会保持不变,因为xslt数据模型并没有保存解析过程中的所有信息。例如,如果输入包含&x3C;然后输出可能包含。类似地,CDATA节也不会保留—相邻的文本节点CDATA节和正常文本模式在解析时合并为一个,虽然您可以配置处理器对某些元素的内容使用CDATA,但您不能简单地将它们保留原样

还有其他问题,例如数据模型不区分,和-它们都表示相同的空元素,输入中的任何一个都可以由输出中的任何一个来表示。正如在您的示例中一样,开始标记中属性之间的空白不会保留


但是,当然,这些差异是XML工具不应该关心的,因为它们以不同的方式表示完全相同的信息集。

一般来说,不可能100%确信所有内容都会保持不变,因为xslt数据模型根本不会保留解析中的所有信息。例如,如果输入包含&x3C;然后输出可能包含。类似地,CDATA节也不会保留—相邻的文本节点CDATA节和正常文本模式在解析时合并为一个,虽然您可以配置处理器对某些元素的内容使用CDATA,但您不能简单地将它们保留原样

还有其他问题,例如数据模型不区分,和-它们都表示相同的空元素,输入中的任何一个都可以由输出中的任何一个来表示。正如在您的示例中一样,开始标记中属性之间的空白不会保留


当然,这些差异是XML工具不应该关心的,因为它们是表示完全相同的信息集的不同方式。

XSLT处理器的默认行为是在输入中保留空白,而我刚刚测试的处理器的行为与规范一致

但所讨论的空白是输入的文本节点中的空白

开始标记中属性值规范之间的空格,以及文档序言和结束语中的注释和处理说明等项之间的空格不是文本节点,不受保留空间设置的影响。事实上,空白也不是XPath数据模型的一部分,因此处理器几乎不能合法地保留它


如果所讨论的空白包含信息,你会想重新审视词汇表的设计,让空白变得有意义真的是个坏主意;如果只是希望属性值规范之间有换行符,那么您可能需要编写一个自定义序列化程序来在输出上插入这样的换行符和缩进。如果您的动机是避免将diff程序与空白差异混淆,那么我的经验是,您的选择是在进行diff之前对空白进行规范化,或者获得一个在面对空白变化时更加健壮的diff程序。祝你好运。

XSLT处理器的默认行为是在输入中保留空白,我刚刚测试的处理器的行为与规范一致

但所讨论的空白是输入的文本节点中的空白

开始标记中属性值规范之间的空格,以及文档序言和结束语中的注释和处理说明等项之间的空格不是文本节点,不受保留空间设置的影响。事实上,空白也不是XPath数据模型的一部分,因此处理器几乎不能合法地保留它


如果所讨论的空白包含信息,你会想重新审视词汇表的设计,让空白变得有意义真的是个坏主意;如果只是希望属性值规范之间有换行符,那么您可能需要编写一个自定义序列化程序来在输出上插入这样的换行符和缩进。如果您的动机是避免将diff程序与空白差异混淆,那么我的经验是,您的选择是在进行diff之前对空白进行规范化,或者获得一个在面对空白变化时更加健壮的diff程序。祝你好运。

不,你不能。输入和输出XML将是 从某种意义上讲,它们产生相同的XML信息集,但它们不一定是逐字节相同的,这不是XSLT可以控制的


你为什么需要这个?如果您试图轻松地比较XML文档,请考虑使用。许多XML库都有生成规范XML的方法,xmllint命令行工具可以轻松地从文件生成规范XML。

不,您不能。输入和输出XML在生成相同的XML信息集的意义上是相同的,但它们不一定是逐字节相同的,这不是XSLT可以控制的


你为什么需要这个?如果您试图轻松地比较XML文档,请考虑使用。许多XML库都有一种生成规范XML的方法,xmllint命令行工具可以轻松地从文件生成规范XML。

感谢您提供了非常有用的输入!嗯,我真正想要的是在源XML中更改wsa:to元素的值,并保持源XML的其余部分为原始格式。@IsmarSlomic这里真正的问题是为什么?如果您绝对必须保留非重要空白的原始格式,那么XSLT不是该作业的正确工具。好的,使用XSLT的原因是因为这是在平台IBM Datapower上使用的唯一工具。保留原始格式的原因是soap:header验证。输入和输出之间唯一可见的区别是soap信封开始标记属性之间的换行符或soap信封元素外部的换行符。您希望SOAP头验证的哪一部分会受到这些影响?感谢非常有用的输入!嗯,我真正想要的是在源XML中更改wsa:to元素的值,并保持源XML的其余部分为原始格式。@IsmarSlomic这里真正的问题是为什么?如果您绝对必须保留非重要空白的原始格式,那么XSLT不是该作业的正确工具。好的,使用XSLT的原因是因为这是在平台IBM Datapower上使用的唯一工具。保留原始格式的原因是soap:header验证。输入和输出之间唯一可见的区别是soap信封开始标记属性之间的换行符或soap信封元素外部的换行符。您希望SOAP头验证的哪一部分会受到这些影响?另一种可能性是,空格不会破坏验证,但是XML被一些不正确的XML解析器读取——臭名昭著的绝望Perl黑客确实存在!另一种可能性是,空格不会破坏验证,但是XML被不正确的XML解析器读取——臭名昭著的绝望Perl黑客确实存在!
<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>
<S:Envelope
  xmlns:S="http://www.w3.org/2003/05/soap-envelope" 
  xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
  xmlns:f123="http://www.fabrikam123.example/svc53">
  <S:Header>
    <wsa:MessageID>
      uuid:aaaabbbb-cccc-dddd-eeee-wwwwwwwwwww
    </wsa:MessageID>
    <wsa:RelatesTo>
      uuid:aaaabbbb-cccc-dddd-eeee-ffffffffffff
    </wsa:RelatesTo>
    <wsa:To S:mustUnderstand="1">
      http://business456.example/client1
    </wsa:To>
    <wsa:Action>http://fabrikam123.example/mail/DeleteAck</wsa:Action>
  </S:Header>
  <S:Body>
    <f123:DeleteAck/>
  </S:Body>
</S:Envelope>
<?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:f123="http://www.fabrikam123.example/svc53">
  <S:Header>
    <wsa:MessageID>
      uuid:aaaabbbb-cccc-dddd-eeee-wwwwwwwwwww
    </wsa:MessageID>
    <wsa:RelatesTo>
      uuid:aaaabbbb-cccc-dddd-eeee-ffffffffffff
    </wsa:RelatesTo>
    <wsa:To S:mustUnderstand="1">
      http://business456.example/client1
    </wsa:To>
    <wsa:Action>http://fabrikam123.example/mail/DeleteAck</wsa:Action>
  </S:Header>
  <S:Body>
    <f123:DeleteAck/>
  </S:Body>
</S:Envelope>