XSLT String Wrap:如何在字符串中换行新行字符(\ n)

时间:2016-07-02 04:59:46

标签: xml string xslt xslt-2.0

我们想为给定的XML编写XSLT转换。 我们正在尝试在按下ENTER KEY时在换行符处对注释元素进行文本换行。其中,<Comment>元素在应用XSLT转换后拆分了6个不同的订单项。

注意: 这里“\ n”是换行符。这意味着结束当前行并转到新行。

我们尝试了以下内容:

在其中观察到的模式:
对于在每个订单项中都有评论子字符串的所有人,<StockCode>元素为空。而StockCode元素对所有<comment>元素的值都是空白的 <OrderDetail>在这里重复节点。

输入XML:

<?xml version="1.0" encoding="WINDOWS-1252"?>

-<SalesOrders xsd:noNamespaceSchemaLocation="SORTOIDOC.XSD" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance">

-<Orders>

-<OrderHeader>

<Customer>000016</Customer>
<OrderDate>2016-04-19</OrderDate>
<SalesForceOrderNumber>ORD-411324</SalesForceOrderNumber>
</OrderHeader>
-<OrderDetails>
-<StockLine>
<StockCode>ABB-CDE-FGH-01</StockCode>
<OrderDescription>EDIORDER-SAVE COMMENTS C3 Generic LOC 0833 Expected arrival 01/07/2016  OTYPE NE TRKPC 01 GM/00007643020008361321</OrderDescription>
</comment>
<OrderLineID>OR-1561179</OrderLineID>
</StockLine>
</OrderDetails>
</Orders>
</SalesOrders>

-<OrderDetails> ---------------------
-<StockLine>
<StockCode>Nil</StockCode>
</Comment>
<OrderLineID>OR-1561180</OrderLineID>
</StockLine>
</OrderDetails>
</Orders>
</SalesOrders>
-<OrderDetails>
-<StockLine>
<StockCode>Nil</StockCode>
</Comment>
<OrderLineID>OR-1561181</OrderLineID>
</StockLine>
</OrderDetails>
</Orders>
</SalesOrders>
-<OrderDetails>
-<StockLine>
<StockCode>Nil</StockCode>
</Comment>
<OrderLineID>OR-1561182</OrderLineID>
</StockLine>
</OrderDetails>
</Orders>
</SalesOrders>
-<OrderDetails>
-<StockLine>
<StockCode>Nil</StockCode>
</Comment>
<OrderLineID>OR-1561183</OrderLineID>
</StockLine>
</OrderDetails>
</Orders>
</SalesOrders>
-<OrderDetails>
-<StockLine>
<StockCode>Nil</StockCode>
</Comment>
<OrderLineID>OR-1561184</OrderLineID>
</StockLine>
</OrderDetails>
</Orders>
</SalesOrders

XSLT转换后的预期XML:

<?xml version="1.0" encoding="WINDOWS-1252"?>

-<SalesOrders xsd:noNamespaceSchemaLocation="SORTOIDOC.XSD" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance">

-<Orders>

-<OrderHeader>

<Customer>000016</Customer>
<OrderDate>2016-04-19</OrderDate>
<SalesForceOrderNumber>ORD-411324</SalesForceOrderNumber>
</OrderHeader>
-<OrderDetails>
-<StockLine>
<StockCode>ABB-CDE-FGH-01</StockCode>
<Comment>Nil</Comment>
<OrderLineID>OR-1561179</OrderLineID>
</StockLine>
</OrderDetails>
</Orders>
</SalesOrders>

-<OrderDetails> ---------------------
-<StockLine>
<StockCode>Nil</StockCode>
<Comment>EDIORDER-SAVE COMMENTS</Comment>
<OrderLineID>OR-1561180</OrderLineID>
</StockLine>
</OrderDetails>
</Orders>
</SalesOrders>
-<OrderDetails>
-<StockLine>
<StockCode>Nil</StockCode>
<Comment>C3 Generic</Comment>
<OrderLineID>OR-1561181</OrderLineID>
</StockLine>
</OrderDetails>
</Orders>
</SalesOrders>
-<OrderDetails>
-<StockLine>
<StockCode>Nil</StockCode>
<Comment>LOC 0833</Comment>
<OrderLineID>OR-1561182</OrderLineID>
</StockLine>
</OrderDetails>
</Orders>
</SalesOrders>
-<OrderDetails>
-<StockLine>
<StockCode>Nil</StockCode>
<Comment>OTYPE NE</Comment>
<OrderLineID>OR-1561183</OrderLineID>
</StockLine>
</OrderDetails>
</Orders>
</SalesOrders>
-<OrderDetails>
-<StockLine>
<StockCode>Nil</StockCode>
<Comment>TRKPC 01 GM/00007643020008361321</Comment>
<OrderLineID>OR-1561184</OrderLineID>
</StockLine>
</OrderDetails>
</Orders>
</SalesOrders

上面的代码分为6个不同的行项目(即每个OrderLineID)。在那里,我们试图在注释字段上实现子串。

如何在新行字符处为Comment Substring编写XSLT转换文件?

提前致谢!

1 个答案:

答案 0 :(得分:1)

要将问题最小化到此处的主要问题,请考虑以下样式表:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="OrderDetails">
    <xsl:copy>
        <xsl:variable name="stockcode" select="StockLine/StockCode" />
        <xsl:for-each select="tokenize(StockLine/Comment, '\\n')">
            <StockLine>
                <xsl:copy-of select="$stockcode"/>
                <Comment>
                    <xsl:value-of select="normalize-space(.)"/>
                </Comment>
                <OrderLineID>???</OrderLineID>
            </StockLine>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

应用于以下输入:

<强> XML

<SalesOrders xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="SORTOIDOC.XSD">
  <Orders>
    <OrderHeader>
      <Customer>000016</Customer>
      <OrderDate>2016-04-19</OrderDate>
      <SalesForceOrderNumber>ORD-411324</SalesForceOrderNumber>
    </OrderHeader>
    <OrderDetails>
      <StockLine>
        <StockCode>NIL</StockCode>
        <Comment>EDIORDER-SAVE COMMENTS\n C3 Generic\n LOC 0833\n Expected arrival 01/07/2016\n  OTYPE NE\n TRKPC 01 GM/00007643020008361321</Comment>
      </StockLine>
    </OrderDetails>
  </Orders>
</SalesOrders>

结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<SalesOrders xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
             xsd:noNamespaceSchemaLocation="SORTOIDOC.XSD">
   <Orders>
      <OrderHeader>
         <Customer>000016</Customer>
         <OrderDate>2016-04-19</OrderDate>
         <SalesForceOrderNumber>ORD-411324</SalesForceOrderNumber>
      </OrderHeader>
      <OrderDetails>
         <StockLine>
            <StockCode>NIL</StockCode>
            <Comment>EDIORDER-SAVE COMMENTS</Comment>
            <OrderLineID>???</OrderLineID>
         </StockLine>
         <StockLine>
            <StockCode>NIL</StockCode>
            <Comment>C3 Generic</Comment>
            <OrderLineID>???</OrderLineID>
         </StockLine>
         <StockLine>
            <StockCode>NIL</StockCode>
            <Comment>LOC 0833</Comment>
            <OrderLineID>???</OrderLineID>
         </StockLine>
         <StockLine>
            <StockCode>NIL</StockCode>
            <Comment>Expected arrival 01/07/2016</Comment>
            <OrderLineID>???</OrderLineID>
         </StockLine>
         <StockLine>
            <StockCode>NIL</StockCode>
            <Comment>OTYPE NE</Comment>
            <OrderLineID>???</OrderLineID>
         </StockLine>
         <StockLine>
            <StockCode>NIL</StockCode>
            <Comment>TRKPC 01 GM/00007643020008361321</Comment>
            <OrderLineID>???</OrderLineID>
         </StockLine>
      </OrderDetails>
   </Orders>
</SalesOrders>

我不知道OrderLineID的内容应该来自哪里。

重要:

如果输入Comment包含实际的换行符 - IOW,如果您的实际输入是:

<强> XML

<SalesOrders xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="SORTOIDOC.XSD">
  <Orders>
    <OrderHeader>
      <Customer>000016</Customer>
      <OrderDate>2016-04-19</OrderDate>
      <SalesForceOrderNumber>ORD-411324</SalesForceOrderNumber>
    </OrderHeader>
    <OrderDetails>
      <StockLine>
        <StockCode>NIL</StockCode>
        <Comment>EDIORDER-SAVE COMMENTS
C3 Generic
LOC 0833
Expected arrival 01/07/2016
 OTYPE NE
TRKPC 01 GM/00007643020008361321</Comment>
      </StockLine>
    </OrderDetails>
  </Orders>
</SalesOrders>

然后使用:

<xsl:for-each select="tokenize(StockLine/Comment, '\n')">

加了:

给出以下输入:

<强> XML

<SalesOrders xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="SORTOIDOC.XSD">
  <Orders>
    <OrderHeader>
      <Customer>000016</Customer>
      <OrderDate>2016-04-19</OrderDate>
      <SalesForceOrderNumber>ORD-411324</SalesForceOrderNumber>
    </OrderHeader>
    <OrderDetails>
      <StockLine>
        <StockCode>ABB-CDE-FGH-01</StockCode>
        <OrderDescription>EDIORDER-SAVE COMMENTS
C3 Generic
LOC 0833
Expected arrival 01/07/2016
 OTYPE NE
TRKPC 01 GM/00007643020008361321</OrderDescription>
        <OrderLineID>OR-1561179</OrderLineID>
      </StockLine>
      <StockLine>
        <StockCode>Nil</StockCode>
        <OrderLineID>OR-1561180</OrderLineID>
      </StockLine>
      <StockLine>
        <StockCode>Nil</StockCode>
        <OrderLineID>OR-1561181</OrderLineID>
      </StockLine>
      <StockLine>
        <StockCode>Nil</StockCode>
        <OrderLineID>OR-1561182</OrderLineID>
      </StockLine>
      <StockLine>
        <StockCode>Nil</StockCode>
        <OrderLineID>OR-1561183</OrderLineID>
      </StockLine>
      <StockLine>
        <StockCode>Nil</StockCode>
        <OrderLineID>OR-1561184</OrderLineID>
      </StockLine>
    </OrderDetails>
  </Orders>
</SalesOrders>

以下样式表:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="StockLine">
    <xsl:variable name="i" select="position()" />
    <xsl:copy>
        <xsl:copy-of select="StockCode"/>
        <Comment>
            <xsl:value-of select="normalize-space(tokenize(../StockLine[1]/OrderDescription, '\n')[$i])"/>
        </Comment>
        <xsl:copy-of select="OrderLineID"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

将返回:

<强>结果

<?xml version="1.0" encoding="UTF-8"?>
<SalesOrders xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
             xsd:noNamespaceSchemaLocation="SORTOIDOC.XSD">
   <Orders>
      <OrderHeader>
         <Customer>000016</Customer>
         <OrderDate>2016-04-19</OrderDate>
         <SalesForceOrderNumber>ORD-411324</SalesForceOrderNumber>
      </OrderHeader>
      <OrderDetails>
         <StockLine>
            <StockCode>ABB-CDE-FGH-01</StockCode>
            <Comment>EDIORDER-SAVE COMMENTS</Comment>
            <OrderLineID>OR-1561179</OrderLineID>
         </StockLine>
         <StockLine>
            <StockCode>Nil</StockCode>
            <Comment>C3 Generic</Comment>
            <OrderLineID>OR-1561180</OrderLineID>
         </StockLine>
         <StockLine>
            <StockCode>Nil</StockCode>
            <Comment>LOC 0833</Comment>
            <OrderLineID>OR-1561181</OrderLineID>
         </StockLine>
         <StockLine>
            <StockCode>Nil</StockCode>
            <Comment>Expected arrival 01/07/2016</Comment>
            <OrderLineID>OR-1561182</OrderLineID>
         </StockLine>
         <StockLine>
            <StockCode>Nil</StockCode>
            <Comment>OTYPE NE</Comment>
            <OrderLineID>OR-1561183</OrderLineID>
         </StockLine>
         <StockLine>
            <StockCode>Nil</StockCode>
            <Comment>TRKPC 01 GM/00007643020008361321</Comment>
            <OrderLineID>OR-1561184</OrderLineID>
         </StockLine>
      </OrderDetails>
   </Orders>
</SalesOrders>