Xml XSLT转换更改名称空间

Xml XSLT转换更改名称空间,xml,xslt,namespaces,xslt-2.0,xml-signature,Xml,Xslt,Namespaces,Xslt 2.0,Xml Signature,我有以下XML(大部分数据是虚拟的) 我正在使用xalan进行测试,这是我在运行上述程序时得到的输出xml <?xml version="1.0" encoding="UTF-8"?> <newmsg xmlns="http://someaddress.com/m2" xsi:schemaLocation="http://someaddress/somexsd.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan

我有以下XML(大部分数据是虚拟的)

我正在使用xalan进行测试,这是我在运行上述程序时得到的输出xml

<?xml version="1.0" encoding="UTF-8"?>
    <newmsg xmlns="http://someaddress.com/m2" xsi:schemaLocation="http://someaddress/somexsd.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<header xmlns="http://someaddress.com/m1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <nodeA>aaaaaaaaaaa</nodeA>
    <nodeB>bbbbbbbb</nodeB>
</header>
<payload xmlns="http://someaddress.com/m1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <calcnode xmlns="http://someaddress/nodeC" xsi:schemaLocation="http://someaddress/somexsd.xsd">
        <somefield>field</somefield>
    </calcnode>
    <ds:Signature>
        <SignedInfo>
            <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
            <Reference URI="#kjbn34jkb5j-3k45j-k3jb534jkb534k5">
                <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                <DigestValue>+se0dfgft9gh8hjuji7ji65ko4ko3ko2</DigestValue>
            </Reference>
        </SignedInfo>
        <SignatureValue>sekfrhsdkjfhsdkjfhksd</SignatureValue>
        <KeyInfo>
            <X509Data>
                <X509Certificate>sdjkfhsdkfhskdf</X509Certificate>
            </X509Data>
        </KeyInfo>
    </ds:Signature>
</payload>
</newmsg>

AAAAAAAAAAAA
bbbbbbbbbb
领域
+SE0DFGFT9GH8JUJI7JI65KO4KO3KO2
sekfrhsdkjfhsdkjfhksd
SDJKFHSKDF
这有两个主要问题:

  • ds
    名称空间只是从输出中消失,我不知道为什么
  • 第二个问题是,它从
    calcnode
    中删除了
    xsi
    名称空间,并且假定
    calcnode
    是用于计算(和验证)签名(位于该部分下方)的节点,这样的更改将使我无法理解签名的验证

  • 我已经尝试了xslt的几个不同的迭代,但没有多少结果。有人能解释一下这种情况吗?

    试着在
    
    我要做的就是将msg元素的名称(改为newmsg)和默认名称空间改为。其他一切都应该保持原样

    样式表:

    <xsl:stylesheet version="2.0" 
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:msg="http://someaddress.com/m1">
    
      <xsl:output omit-xml-declaration="yes"/>
    
      <xsl:template match="@* | node()">
        <xsl:copy copy-namespaces="no">
          <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
      </xsl:template>
    
      <!-- Process all elements (except 'msg') in the 'msg' namespace -->
      <xsl:template match="msg:*">
        <xsl:element name="{local-name()}" namespace="http://someaddress.com/m2">
          <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
      </xsl:template>
    
      <!-- Change 'msg' element into 'newmsg' -->
      <xsl:template match="msg:msg">
        <xsl:element name="newmsg" namespace="http://someaddress.com/m2" >
          <!-- Keep "ds" declaration on the root element -->
          <xsl:namespace name="ds" select="'http://www.w3.org/2000/09/xmldsig#'"/>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
      </xsl:template>
    </xsl:stylesheet>
    
    
    
    当样式表应用于XML源时,它会输出(使用Saxon 9.4):

    
    AAAAAAAAAAAA
    bbbbbbbbbb
    领域
    +SE0DFGFT9GH8JUJI7JI65KO4KO3KO2
    sekfrhsdkjfhsdkjfhksd
    SDJKFHSKDF
    

    这并不完全是你想要的,但很接近。仍然没有
    xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“
    calcnode
    元素上声明,因为
    xsi
    已在根元素上声明。如果这是签名处理的问题,我不确定如何解决。

    此转换:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:oldDef="http://someaddress.com/m1" exclude-result-prefixes="oldDef">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="*">
      <xsl:element name="{name()}" namespace="{namespace-uri()}">
       <xsl:copy-of select="namespace::*[name()]|@*"/>
       <xsl:apply-templates select="node()"/>
      </xsl:element>
     </xsl:template>
    
     <xsl:template match="*[namespace-uri()='http://someaddress.com/m1']">
      <xsl:element name="{name()}" namespace="http://someaddress.com/m2">
       <xsl:copy-of select="namespace::*[name()]"/>
       <xsl:copy-of select="@*"/>
       <xsl:apply-templates select="node()"/>
      </xsl:element>
     </xsl:template>
    
     <xsl:template match="oldDef:msg[true()]">
      <newmsg xmlns="http://someaddress.com/m2">
       <xsl:copy-of select="namespace::*[name()]|@*"/>
       <xsl:apply-templates select="node()"/>
      </newmsg>
     </xsl:template>
    </xsl:stylesheet>
    
    
    
    应用于提供的XML文档时:

    <msg xmlns="http://someaddress.com/m1"  xmlns:ds="http://www.w3.org/2000/09/xmldsig#"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://someaddress/somexsd.xsd">
    <header>
        <nodeA>aaaaaaaaaaa</nodeA>
        <nodeB>bbbbbbbb</nodeB>
    </header>
    <payload>
        <calcnode   xmlns="http://someaddress/nodeC"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://someaddress/somexsd.xsd">
            <somefield>field</somefield>
        </calcnode>
        <ds:Signature>
            <SignedInfo>
                <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                <Reference URI="#kjbn34jkb5j-3k45j-k3jb534jkb534k5">
                    <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                    <DigestValue>+se0dfgft9gh8hjuji7ji65ko4ko3ko2</DigestValue>
                </Reference>
            </SignedInfo>
            <SignatureValue>sekfrhsdkjfhsdkjfhksd</SignatureValue>
            <KeyInfo>
                <X509Data>
                    <X509Certificate>sdjkfhsdkfhskdf</X509Certificate>
                </X509Data>
            </KeyInfo>
        </ds:Signature>
    </payload>
    </msg>
    
    <newmsg xmlns="http://someaddress.com/m2" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://someaddress/somexsd.xsd">
       <header>
          <nodeA>aaaaaaaaaaa</nodeA>
          <nodeB>bbbbbbbb</nodeB>
       </header>
       <payload>
          <calcnode xmlns="http://someaddress/nodeC" xsi:schemaLocation="http://someaddress/somexsd.xsd">
             <somefield>field</somefield>
          </calcnode>
          <ds:Signature>
             <SignedInfo>
                <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                <Reference URI="#kjbn34jkb5j-3k45j-k3jb534jkb534k5">
                   <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                   <DigestValue>+se0dfgft9gh8hjuji7ji65ko4ko3ko2</DigestValue>
                </Reference>
             </SignedInfo>
             <SignatureValue>sekfrhsdkjfhsdkjfhksd</SignatureValue>
             <KeyInfo>
                <X509Data>
                   <X509Certificate>sdjkfhsdkfhskdf</X509Certificate>
                </X509Data>
             </KeyInfo>
          </ds:Signature>
       </payload>
    </newmsg>
    
    
    AAAAAAAAAAAA
    bbbbbbbbbb
    领域
    +SE0DFGFT9GH8JUJI7JI65KO4KO3KO2
    sekfrhsdkjfhsdkjfhksd
    SDJKFHSKDF
    
    生成所需的正确结果:

    <msg xmlns="http://someaddress.com/m1"  xmlns:ds="http://www.w3.org/2000/09/xmldsig#"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://someaddress/somexsd.xsd">
    <header>
        <nodeA>aaaaaaaaaaa</nodeA>
        <nodeB>bbbbbbbb</nodeB>
    </header>
    <payload>
        <calcnode   xmlns="http://someaddress/nodeC"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://someaddress/somexsd.xsd">
            <somefield>field</somefield>
        </calcnode>
        <ds:Signature>
            <SignedInfo>
                <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                <Reference URI="#kjbn34jkb5j-3k45j-k3jb534jkb534k5">
                    <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                    <DigestValue>+se0dfgft9gh8hjuji7ji65ko4ko3ko2</DigestValue>
                </Reference>
            </SignedInfo>
            <SignatureValue>sekfrhsdkjfhsdkjfhksd</SignatureValue>
            <KeyInfo>
                <X509Data>
                    <X509Certificate>sdjkfhsdkfhskdf</X509Certificate>
                </X509Data>
            </KeyInfo>
        </ds:Signature>
    </payload>
    </msg>
    
    <newmsg xmlns="http://someaddress.com/m2" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://someaddress/somexsd.xsd">
       <header>
          <nodeA>aaaaaaaaaaa</nodeA>
          <nodeB>bbbbbbbb</nodeB>
       </header>
       <payload>
          <calcnode xmlns="http://someaddress/nodeC" xsi:schemaLocation="http://someaddress/somexsd.xsd">
             <somefield>field</somefield>
          </calcnode>
          <ds:Signature>
             <SignedInfo>
                <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                <Reference URI="#kjbn34jkb5j-3k45j-k3jb534jkb534k5">
                   <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                   <DigestValue>+se0dfgft9gh8hjuji7ji65ko4ko3ko2</DigestValue>
                </Reference>
             </SignedInfo>
             <SignatureValue>sekfrhsdkjfhsdkjfhksd</SignatureValue>
             <KeyInfo>
                <X509Data>
                   <X509Certificate>sdjkfhsdkfhskdf</X509Certificate>
                </X509Data>
             </KeyInfo>
          </ds:Signature>
       </payload>
    </newmsg>
    
    
    AAAAAAAAAAAA
    bbbbbbbbbb
    领域
    +SE0DFGFT9GH8JUJI7JI65KO4KO3KO2
    sekfrhsdkjfhsdkjfhksd
    SDJKFHSKDF
    
    Xalan是XSLT 1.0处理器,但您的样式表是XSLT 2.0。改用Saxon 9.4。谢谢。我想指出的是,想要得到的结果是,除了上面提到的部分之外,xml中没有任何内容发生实际更改,但这里的情况并非如此(尽管仍然是有效的xml),但这似乎是不可能的,所以我将看看是否有可能使用它。@NooK,正确,这只是词汇上的差异,并且不能由XSLT结果的序列化控制。谢谢。它看起来确实很接近,尽管在这种情况下可能是最接近的。我确实得到了一个稍有不同的结果,使用的名称空间比上面显示的多,但这可能是由于数据稍有不同。
    <newmsg xmlns="http://someaddress.com/m2" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://someaddress/somexsd.xsd">
       <header>
          <nodeA>aaaaaaaaaaa</nodeA>
          <nodeB>bbbbbbbb</nodeB>
       </header>
       <payload>
          <calcnode xmlns="http://someaddress/nodeC" xsi:schemaLocation="http://someaddress/somexsd.xsd">
             <somefield>field</somefield>
          </calcnode>
          <ds:Signature>
             <SignedInfo>
                <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                <Reference URI="#kjbn34jkb5j-3k45j-k3jb534jkb534k5">
                   <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                   <DigestValue>+se0dfgft9gh8hjuji7ji65ko4ko3ko2</DigestValue>
                </Reference>
             </SignedInfo>
             <SignatureValue>sekfrhsdkjfhsdkjfhksd</SignatureValue>
             <KeyInfo>
                <X509Data>
                   <X509Certificate>sdjkfhsdkfhskdf</X509Certificate>
                </X509Data>
             </KeyInfo>
          </ds:Signature>
       </payload>
    </newmsg>