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结果中删除不需要的XML_Xml_Xslt - Fatal编程技术网

XSLT从XSLT结果中删除不需要的XML

XSLT从XSLT结果中删除不需要的XML,xml,xslt,Xml,Xslt,我有一个XML,它包含一个XML作为字符串: <Result> <XML> &lt;PingRS xmlns="http://www.test.com"&gt; &lt;Message&gt; Hello. &lt;/Message&gt; &lt;/PingRS&gt; </XML> &l

我有一个XML,它包含一个XML作为字符串:

<Result>
    <XML>
       &lt;PingRS xmlns="http://www.test.com"&gt;
          &lt;Message&gt;
             Hello.
          &lt;/Message&gt;
      &lt;/PingRS&gt;
    </XML>
</Result>

PingRS xmlns=”http://www.test.com"
消息
你好
/信息
/平格斯
我正在使用以下XSLT对其进行转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:template match="/Result">
    <xsl:value-of select="XML" disable-output-escaping="yes" />
  </xsl:template> 
</xsl:stylesheet>

要获得此结果,请执行以下操作:

<PingRS xmlns="http://www.test.com">
    <Message>Hello.</Message>
</PingRS>

你好

我想删除同一XSLT文件中的
xmlns
属性。这是可能的吗?

这是可能的,但是由于
元素不包含XML,因此必须通过字符串操作来完成:

<xsl:template match="/Result">
<xsl:variable name="xmlns" select="' xmlns=&quot;http://www.test.com&quot;'" />
    <xsl:value-of select="substring-before(XML, $xmlns)" disable-output-escaping="yes" />
    <xsl:value-of select="substring-after(XML, $xmlns)" disable-output-escaping="yes" />
</xsl:template> 


顺便说一句,你展示的结果是不正确的-你真正得到的是:

   <PingRS xmlns="http://www.test.com">
      <Message>
         Hello.
      </Message>
  </PingRS>

你好

编辑:

如果事先不知道xmlns的内容,可以使用:

<xsl:template match="/Result">
    <xsl:value-of select="substring-before(XML, ' xmlns=&quot;')" disable-output-escaping="yes" />
    <xsl:value-of select="substring-after(substring-after(XML, ' xmlns=&quot;'), '&quot;')" disable-output-escaping="yes" />
</xsl:template> 


您能转换两次(不同的样式表或相同的样式表)吗?谢谢。如果xmlns的内容将被更改,我可以在select中使用regex吗?像
select=“'xmlns=“*””
?@bale3一样,您不能在XSLT1.0中使用正则表达式;您只需要使用更复杂的字符串操作-请参阅对我的答案的编辑。答案是使用字符串操作。XSLT中的字符串操作与任何编程语言中使用字符串的XML处理具有相同的弱点。也就是说,XSLT正好在这种情况下工作,但不适用于等价的XML,如
x:PingRS-xmlns:x=”http://www.test.com“y:消息xmlns:y=”http://www.test.com“你好/y:Message/x:PingRS
。因此,如果您无法控制输入,给定的解决方案可能无法工作。@ThomasW。1.给定的输入包含一个需要修改的字符串;因此,需要对字符串进行操作。2.一般来说,XSLT以其设计的格式(语法、模式)进行输入;这不限于字符串。