2016-08-01 1 views
0

XML을 입력했습니다. 그 안에서, <LineActionType> 요소를 사용해 일정한 값을 넣으려고했습니다.XSLT : XML 요소를 사용하여 상수 값을 할당하는 방법

기본적으로 <LineActionType >A<LineActionType />이 요소 상수 값을 각 설명란 태그에 추가하려고합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xsl:output method="xml" encoding="Windows-1252" indent="yes" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="OrderDetails"> 
     <xsl:copy> 
     <xsl:apply-templates select="*"> 
      <xsl:sort select="xs:integer(UserDefined)" /> 
     </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="StockLine[not(StockCodeDescription) and not (OrderQty) and not(Price)]"> 
     <CommentLine> 
     <Comment> 
      <xsl:value-of select="StockCode" /> 
     </Comment> 
     <xsl:copy-of select="OrderLineID" /> 
     <xsl:copy-of select="UserDefined" /> 
     </CommentLine> 
    </xsl:template> 
    <xsl:template match="CommentLine[OrderLineID = preceding-sibling::StockLine/OrderLineID and not(Comment)]" /> 
    <xsl:template match="CommentLine[some $sib in preceding-sibling::CommentLine satisfies deep-equal(., $sib)]" /> 
</xsl:stylesheet> 

이 예상 출력 :

<?xml version="1.0" encoding="UTF-8"?> 
<SalesOrders xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="SORTOIDOC.XSD"> 
    <Orders> 
     <OrderHeader> 
     <CustomerPoNumber>Manual Order 1</CustomerPoNumber> 
     <OrderActionType>A</OrderActionType> 
     </OrderHeader> 
     <OrderDetails> 
     <StockLine> 
      <CustomerPoLine>9999</CustomerPoLine> 
      <StockCode>abc-1</StockCode> 
      <StockDescription>ASSEMBLED</StockDescription> 
      <OrderQty>2.0</OrderQty> 
      <OrderUom>EA</OrderUom> 
      <PriceUom>EA</PriceUom> 
      <AlwaysUsePriceEntered>Y</AlwaysUsePriceEntered> 
      <UserDefined>1</UserDefined> 
      <OrderLineID>OR-1810141</OrderLineID> 
     </StockLine> 
     <StockLine> 
      <CustomerPoLine>9999</CustomerPoLine> 
      <StockCode>FBX-SMO30029-8</StockCode> 
      <StockDescription>TARGET SOAP PDQ 2014 ASSEMBLED</StockDescription> 
      <OrderQty>3.0</OrderQty> 
      <OrderUom>EA</OrderUom> 
      <PriceUom>EA</PriceUom> 
      <AlwaysUsePriceEntered>Y</AlwaysUsePriceEntered> 
      <UserDefined>2</UserDefined> 
      <OrderLineID>OR-1810142</OrderLineID> 
     </StockLine> 
     <CommentLine> 
      <Comment>Comment#1</Comment> 
      <OrderLineID>OR-1810143</OrderLineID> 
      <UserDefined>3</UserDefined> 
      <LineActionType >A<LineActionType /> 
     </CommentLine> 
     <CommentLine> 
      <Comment>Comment#2</Comment> 
      <OrderLineID>OR-1810144</OrderLineID> 
      <UserDefined>4</UserDefined> 
      <LineActionType >A<LineActionType /> 
     </CommentLine> 
     </OrderDetails> 
    </Orders> 
</SalesOrders> 

이 거기에 어떤 도움이 많이 주시면 감사하겠습니다 우리는 XSLT 2.0 다음 ​​시도

<CommentLine> 
        <Comment>Comment#1</Comment> 
        <OrderLineID>OR-1810143</OrderLineID> 
        <UserDefined>3</UserDefined> 
        <LineActionType >A<LineActionType /> 
       </CommentLine> 

입력 XML

<?xml version="1.0" encoding="UTF-8"?> 
<SalesOrders xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="SORTOIDOC.XSD"> 
    <Orders> 
     <OrderHeader> 
     <CustomerPoNumber>Manual Order 1</CustomerPoNumber> 
     <OrderActionType>A</OrderActionType> 
     </OrderHeader> 
     <OrderDetails> 
     <StockLine> 
      <CustomerPoLine>9999</CustomerPoLine> 
      <StockCode>abc-1</StockCode> 
      <StockDescription>ASSEMBLED</StockDescription> 
      <OrderQty>2.0</OrderQty> 
      <OrderUom>EA</OrderUom> 
      <PriceUom>EA</PriceUom> 
      <AlwaysUsePriceEntered>Y</AlwaysUsePriceEntered> 
      <UserDefined>1</UserDefined> 
      <OrderLineID>OR-1810141</OrderLineID> 
     </StockLine> 
     <StockLine> 
      <CustomerPoLine>9999</CustomerPoLine> 
      <StockCode>FBX-SMO30029-8</StockCode> 
      <StockDescription>TARGET SOAP PDQ 2014 ASSEMBLED</StockDescription> 
      <OrderQty>3.0</OrderQty> 
      <OrderUom>EA</OrderUom> 
      <PriceUom>EA</PriceUom> 
      <AlwaysUsePriceEntered>Y</AlwaysUsePriceEntered> 
      <UserDefined>2</UserDefined> 
      <OrderLineID>OR-1810142</OrderLineID> 
     </StockLine> 
     <CommentLine> 
      <Comment>Comment#1</Comment> 
      <OrderLineID>OR-1810143</OrderLineID> 
      <UserDefined>3</UserDefined> 
      <LineActionType /> 
     </CommentLine> 
     <CommentLine> 
      <Comment>Comment#2</Comment> 
      <OrderLineID>OR-1810144</OrderLineID> 
      <UserDefined>4</UserDefined> 
      <LineActionType /> 
     </CommentLine> 
     </OrderDetails> 
    </Orders> 
</SalesOrders> 

입니다 ?

+0

당신이 당신의 코드를 디버깅나요 기존의 하나 개 인 출력을 방지하기 위해? –

답변

2

먼저 <LineActionType >A<LineActionType />은 유효한 XML이 아니므로 <LineActionType>A</LineActionType>을 의미한다고 가정합니다. 모든 CommentLine 요소가 LineActionType했다 방금 A에 그들 모두를 설정하기를 원한다면 LineActionType 항상 존재하지 않는 경우

어쨌든, 당신은 단지,

<xsl:template match="CommentLine/LineActionType"> 
    <xsl:copy>A</xsl:copy> 
</xsl:template> 

대안의 정체성 서식 파일과 함께이 템플릿을 추가 할 수 있습니다 CommentLine에서이 두 템플릿을 대신 추가 할 수 있습니다. 하나는 어떤 CommentLine 아래를 추가하고, (이 두 번 출력을하지 않도록) 다른 하나는

<xsl:template match="CommentLine"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
     <LineActionType>A</LineActionType> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="CommentLine/LineActionType" /> 
+0

주어진 두 템플릿을 모두 적용하려고 할 때. 그것은 나를 위해 작동하지 않았다. – NEO

+0

구문 오류가 발생하지 않습니다. 또한 일정한 가치를 창출하지 못합니다. – NEO

+0

http://xsltransform.net/pPJ8LUM 또는 http://xsltransform.net/bwdwru에서 두 가지 가능성을 확인하십시오. 둘 다 입력을 기반으로 기대되는 결과를 산출합니다. 주의해야 할 것은 XSLT에'CommentLine'과 일치하는 다른 템플릿을 추가하는 것이므로'priority' 속성을 추가해야 할 수도 있습니다. 또한, XSLT 귀하의 질문에'StockLine'에서'CommentLine'을 생성하는 템플릿을 가지고 있습니다. 이 파일에'LineActionType'을 포함 시키길 원하면 단순히 기존 템플릿의 일부로 추가하기 만하면됩니다. –