Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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 XSLT1.0:忽略模板中所有不匹配的元素_Xml_Templates_Xslt 1.0 - Fatal编程技术网

Xml XSLT1.0:忽略模板中所有不匹配的元素

Xml XSLT1.0:忽略模板中所有不匹配的元素,xml,templates,xslt-1.0,Xml,Templates,Xslt 1.0,如何防止XSLT输出所有元素的默认行为?简单地说,我想忽略所有与我的模板不匹配的元素 我有以下XML: <?xml version="1.0" encoding="UTF-8"?> <SDHttpMessage> <Headers> <Parameter name="Type">text/xml;charset=UTF-8</Parameter> </Headers> <Charset>UTF-8<

如何防止XSLT输出所有元素的默认行为?简单地说,我想忽略所有与我的模板不匹配的元素

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<SDHttpMessage>
<Headers>
    <Parameter name="Type">text/xml;charset=UTF-8</Parameter>
</Headers>
<Charset>UTF-8</Charset>
<Message>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <soapenv:Body>
            <Content>
                <MyContent>
                   <A>Text A</A>
                   <B>Text B</B>
                   <C>Text C</C>
                </MyContent>
            </Content>
        </soapenv:Body>
    </soapenv:Envelope>
</Message>

text/xml;字符集=UTF-8
UTF-8
文本A
文本B
文本C

以及以下XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            exclude-result-prefixes="soapenv xsd xsi">

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />

<xsl:template match="Content/MyContent">
   <A><xsl:value-of select="A" /></A>
   <B><xsl:value-of select="B" /></B>
   <C><xsl:value-of select="C" /></C>
</xsl:template>

期望输出:

<A>Text A</A>
<B>Text B</B>
<C>Text C</C>
文本A
文本B
文本C
实际产量:

text/xml;charset=UTF-8UTF-8
<A>Text A</A>
<B>Text B</B>
<C>Text C</C>
text/xml;字符集=UTF-8UTF-8
文本A
文本B
文本C
我想简单地在根元素模板中调用我的模板:

<xsl:template match="/">
    <xsl:call-template name="callMyTemplate" />
</xsl:template>

<xsl:template match="Content/MyContent" name="callMyTemplate">
   <A><xsl:value-of select="A" /></A>
   <B><xsl:value-of select="B" /></B>
   <C><xsl:value-of select="C" /></C>
</xsl:template>
<xsl:template match="text()"/>

但它与当时的任何元素都不匹配

那么,如果我只想忽略所有不匹配的元素,那么最好的方法是什么呢


提前感谢。

您可以添加模板以绕过其他分支:

<xsl:template match="/SDHttpMessage">
    <xsl:apply-templates select="Message/soapenv:Envelope/soapenv:Body/Content/MyContent"/>
</xsl:template>

或替代内置模板:

<xsl:template match="/">
    <xsl:call-template name="callMyTemplate" />
</xsl:template>

<xsl:template match="Content/MyContent" name="callMyTemplate">
   <A><xsl:value-of select="A" /></A>
   <B><xsl:value-of select="B" /></B>
   <C><xsl:value-of select="C" /></C>
</xsl:template>
<xsl:template match="text()"/>

或者你可以简单地做:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
exclude-result-prefixes="soapenv">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />

<xsl:template match="/SDHttpMessage">
    <xsl:for-each select="Message/soapenv:Envelope/soapenv:Body/Content/MyContent/*">
        <xsl:element name="{name()}">
            <xsl:value-of select="." />
        </xsl:element>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>


您确定要输出一个不带根元素的XML片段吗?谢谢您的评论,我只想让示例尽可能基本