0

我正在尝试应用转换来生成 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"/>....
4

1 回答 1

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>

- - - - - -编辑 - - - - - - - - - - - - -

有了这个输入

<?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>
于 2013-04-10T01:33:11.353 回答