xslt中出现不需要的元素数据(没有元素)

时间:2013-04-10 00:31:05

标签: xslt

我正在尝试应用转换来生成rdf文档。我的源xml包含一个我想忽略的元素,但输出(通过SAP的转换测试工具生成)包含SYSINFO元素的(连接!)文本。
我尝试了几种变体(例如xsl:apply-templates select =“asx:abap / asx:/ values / CT”) 但后来我根本没有输出。嗯。花了几个小时尝试不同的东西和研究,但没有得到任何结果。任何帮助真的很感激。约翰

这是我的样本xml(片段)

<?xml version="1.0" encoding="utf-8"?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml"version="1.0">
<asx:values>
<SYSINFO>
    <SERVER_NAME>sapserver06</SERVER_NAME>
    <SYSTEM_ID>ECC</SYSTEM_ID>
    <SAP_RELEASE>701</SAP_RELEASE>
    <SYS_NR>00</SYS_NR>
    <CLIENT>800</CLIENT>
    <EXE_USER>XXX</EXE_USER>
    <LOGON_LANGUAGE>E</LOGON_LANGUAGE>
    <DATE>2013-04-09</DATE>
    <TIME>12:06:58</TIME>
    <TIMEZONE>CST</TIMEZONE>
    <OPERATING_SYSTEM>Windows NT</OPERATING_SYSTEM>
    <LICENSE_NUMBER>YYY</LICENSE_NUMBER>
    <SAP_CUSTOMER>ZZZ</SAP_CUSTOMER>
    <CLIENT_CATEGORY>C</CLIENT_CATEGORY>
    <LANGUAGES_INSTALLED>JED</LANGUAGES_INSTALLED>
</SYSINFO>
<CT>
<item>
    <ID>1</ID>
    <TABNAME>T000</TABNAME>
    <FIELDNAME>ADRNR</FIELDNAME>
    <KEYFLAG/>
    <ROLLNAME>CHAR10</ROLLNAME>
</item>
.....
</CT>
</asx:values>
</asx:abap>

这是转型

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sap_coda="http://www.sapmantics.com/sap_coda#" version="1.0">

  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <rdf:RDF>
      <xsl:apply-templates/>
    </rdf:RDF>
  </xsl:template>

  <xsl:template>
    <xsl:for-each select="//item">
      <rdf:Description>
        <xsl:attribute name="rdf:about">
          <xsl:value-of select="TABNAME"/>
        </xsl:attribute>
        <rdf:type rdf:resource="http://www.sapmantics.com/sap_coda#ctable"/>
        <sap_coda:t2f>
          <rdf:Description>
            <xsl:attribute name="rdf:about">
              <xsl:value-of select="FIELDNAME"/>
            </xsl:attribute>
            <rdf:type rdf:resource="http://www.sapmantics.com/sap_coda#cfield"/>
            <xsl:if test="KEYFLAG=X">
              <sap_coda:keyflag>X</sap_coda:keyflag>
            </xsl:if>
          </rdf:Description>
        </sap_coda:t2f>
      </rdf:Description>
    </xsl:for-each>
  </xsl:template>

</xsl:transform>

最后,这是输出:

<?xml version="1.0" encoding="utf-16"?>
sapserver06ECC70100800XXXE2013-04-0917:21:50CSTWindowsNTYYYZZZCJED
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sap_coda="http://www.sapmantics.com/sap_coda#">
<rdf:Description rdf:about="T000">
<rdf:type rdf:resource="http://www.sapmantics.com/sap_coda#ctable"/>....

1 个答案:

答案 0 :(得分:1)

<SYSINFO/>文本节点的串联可以通过元素节点的默认处理来解释:

http://www.w3.org/TR/xslt#built-in-rule

我不知道您使用的是哪个XSLT处理器,但我很惊讶您的//item处理程序没有标记为缺少@match属性。您可以使用以下内容对其进行更新,它将按文档顺序处理每个<item/>元素:

<xsl:template match="item">
    <rdf:Description>

要使您的SYSINFO内容不被包含在您的RDF中(如果这是您的意图),请使用以下内容更新您的根模板:

<rdf:RDF>
    <xsl:apply-templates select="//item"/>
</rdf:RDF>

----------- EDIT --------------------------

使用此输入

<?xml version="1.0" encoding="utf-8"?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml">
    <asx:values>
        <SYSINFO>
            <SERVER_NAME>sapserver06</SERVER_NAME>
            <SYSTEM_ID>ECC</SYSTEM_ID>
            <SAP_RELEASE>701</SAP_RELEASE>
            <SYS_NR>00</SYS_NR>
            <CLIENT>800</CLIENT>
            <EXE_USER>XXX</EXE_USER>
            <LOGON_LANGUAGE>E</LOGON_LANGUAGE>
            <DATE>2013-04-09</DATE>
            <TIME>12:06:58</TIME>
            <TIMEZONE>CST</TIMEZONE>
            <OPERATING_SYSTEM>Windows NT</OPERATING_SYSTEM>
            <LICENSE_NUMBER>YYY</LICENSE_NUMBER>
            <SAP_CUSTOMER>ZZZ</SAP_CUSTOMER>
            <CLIENT_CATEGORY>C</CLIENT_CATEGORY>
            <LANGUAGES_INSTALLED>JED</LANGUAGES_INSTALLED>
        </SYSINFO>
        <CT>
            <item>
                <ID>1</ID>
                <TABNAME>T000</TABNAME>
                <FIELDNAME>ADRNR</FIELDNAME>
                <KEYFLAG/>
                <ROLLNAME>CHAR10</ROLLNAME>
            </item>
        </CT>
    </asx:values>
</asx:abap>

和这个样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:sap="http://www.sap.com/sapxsl"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:sap_coda="http://www.sapmantics.com/sap_coda#" 
    version="1.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <rdf:RDF>
            <xsl:apply-templates select="//item"/>
        </rdf:RDF>
    </xsl:template>

    <xsl:template match="item[parent::CT]">
        <rdf:Description>
            <xsl:attribute name="rdf:about">
                <xsl:value-of select="TABNAME"/>
            </xsl:attribute>
            <rdf:type rdf:resource="http://www.sapmantics.com/sap_coda#ctable"/>
            <sap_coda:t2f>
                <rdf:Description>
                    <xsl:attribute name="rdf:about">
                        <xsl:value-of select="FIELDNAME"/>
                    </xsl:attribute>
                    <rdf:type rdf:resource="http://www.sapmantics.com/sap_coda#cfield"/>
                    <xsl:if test="KEYFLAG=X">
                        <sap_coda:keyflag>X</sap_coda:keyflag>
                    </xsl:if>
                </rdf:Description>
            </sap_coda:t2f>
        </rdf:Description>
    </xsl:template>

    <xsl:template match="item[parent::FOO]"/> 

    <xsl:template match="item"/> 
</xsl:transform>

我从Saxon-EE 9.4.0.3得到了这个输出:

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:sap="http://www.sap.com/sapxsl"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:sap_coda="http://www.sapmantics.com/sap_coda#">
   <rdf:Description rdf:about="T000">
      <rdf:type rdf:resource="http://www.sapmantics.com/sap_coda#ctable"/>
      <sap_coda:t2f>
         <rdf:Description rdf:about="ADRNR">
            <rdf:type rdf:resource="http://www.sapmantics.com/sap_coda#cfield"/>
         </rdf:Description>
      </sap_coda:t2f>
   </rdf:Description>
</rdf:RDF>

和xstlproc的输出:

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sap="http://www.sap.com/sapxsl" xmlns:sap_coda="http://www.sapmantics.com/sap_coda#">
  <rdf:Description rdf:about="T000">
    <rdf:type rdf:resource="http://www.sapmantics.com/sap_coda#ctable"/>
    <sap_coda:t2f>
      <rdf:Description rdf:about="ADRNR">
        <rdf:type rdf:resource="http://www.sapmantics.com/sap_coda#cfield"/>
      </rdf:Description>
    </sap_coda:t2f>
  </rdf:Description>
</rdf:RDF>