2017-10-14 8 views
0

비슷한 질문을 여러 번 보았습니다. 그러나이 질문이 제 사례에 적용되는지 또는 단순히 프로세스를 이해하지 못했는지는 확실하지 않습니다.XML 태그를 XSLT로 텍스트 노드로 바꿉니다.

나는 규칙의 목록을 포함하는 XML 파일이 :

<rules> 
    <rule id="1"> 
     <block> 
      [HTML content] 
     </block> 
     <block> 
      [HTML content] 
     </block> 
     <block> 
      [HTML content] 
     </block> 
    </rule> 
    <rule id="2"> 
     <block> 
      [HTML content] 
     </block> 
     <block> 
      [HTML content] 
     </block> 
    </rule> 
    [...] 
</rules> 

지금 내 코드는 다음과 같은 :

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml"> 
    <xsl:template match="/rules/rule"> 
     [some output to create the header and title] 
     <xsl:for-each select="block"> 
      <xsl:copy-of select="./node()" /> 
     </xsl:for-each> 
     [some output to create the footer] 
    </xsl:template> 
</xsl:stylesheet> 

명확하게하기 위해,이 문서 전체가 아니라 사용자가 규칙을 클릭하여 콘텐츠 및 코드를 볼 때 AJAX를 통해 호출되는 부분보다 훨씬 간단합니다. 다양한 block 요소를 표시하는 방법에 대해 내부에서 결정해야하는 몇 가지 결정 사항이 있지만 지금은 이 부분들은 m에 불필요하다. y 문제가 있으며 코드 읽기가 더 어려워집니다.

이 특별한 경우에는 HTML 콘텐츠를 직접 저장하므로 XSLT가 적절하지 않은 것처럼 보일 수 있습니다. 그러나 이것은 데이터가 훨씬 더 설계된 더 큰 프로젝트의 일부입니다. 이것이 내가 리조트에 가져다 준 유일한 부분입니다. 이 해결책에.

그러나 rule 태그 안에는 규칙의 ID와 1-1, 1-2 등의 두 번째 숫자가있는 테이블이 있습니다. 문제는 약 20 개의 규칙과 계획이 있습니다. 비선형 방식으로 목록을 확장합니다. 지금은 규칙 1과 규칙 2 사이에 규칙을 추가하고 싶습니다. 따라서 다음 테이블 ID를 모두 수정해야합니다. 과거에는 이미 이런 일이 벌써 일어 났으므로 앞으로는 이런 일이 발생하지 않을 것이므로이 쓸데없는 추가 작업을 피하고 Table <id />-12: [...]과 같이 <id /> 태그로 교체하고 <id />을 규칙의 ID로 바꿉니다. . 나는 이런 식으로 코드를 수정하려고 :

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml"> 
    <xsl:template match="/rules/rule"> 
     [some output to create the header and title] 
     <xsl:for-each select="block"> 
      <xsl:copy> 
       <xsl:apply-templates select="node()|@*" /> 
      </xsl:copy> 
     </xsl:for-each> 
     [some output to create the footer] 
    </xsl:template> 
    <xsl:template match="id"><xsl:value-of select="ancestor::rule/@id" /></xsl:template> 
</xsl:stylesheet> 

치환 작업, 유일한 문제는 이전 코드가 그랬던 것처럼 다른 모든 태그가 사라 동안 <block> 태그, 제거되지 않습니다 것입니다. HMTL 태그가없는 단일 텍스트 블록 만 있습니다.

은 내가 this one 같은 질문에서 복사,이 솔루션을 마련 할 수 없습니다, 그러나 이것은 내가 <xsl:copy><xsl:apply-templates> 태그가 발생한 것은 이번이 처음이다, 그래서 나는 그들이 어떻게 작동하는지 정말 모르겠어요. 더욱이, 내가 발견 한 모든 예제는 이전에 링크 된 예제와 비슷합니다. 여기서 거의 정확한 복사본이 필요합니다. 또한 주 출력 주위에 많은 추가 코드를 추가해야하며이 대체 코드와 어떻게 상호 작용하는지 잘 모르겠습니다.

편집 : 나는 또한 for-each 사이클 내부의 변형

  <xsl:apply-templates select="node()|@*"> 
       <xsl:copy-of select="./node()" /> 
      </xsl:apply-templates> 

을 시도,하지만 난 같은 결과를 얻을 : 텍스트를 태그하지 않고 있지만, 대체 작동합니다. apply-templates 태그가 모든 태그를 제거하는 것처럼 보이지만 태그를 보존하는 방법을 모르겠습니다. 당신이 발견 한 용액에 for-each 루프에서

답변

2

봐 :이 루프에서

<xsl:for-each select="block"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
</xsl:for-each> 

:

  • <xsl:copy>가 실제로 <block> 여는 태그를 출력합니다.
  • <xsl:apply-templates .../> - 소스 태그의 내용을 "실행"합니다.
  • </xsl:copy>은 이번에는 닫는 태그 </block>을 출력합니다. 당신이 <block> 태그를하지 않기 때문에

, 단지 <xsl:copy></xsl:copy>를 제거합니다.

은 스크립트에 의 정체성 서식를 추가 사라지는에서 다른 태그를 방지합니다.

그 이유는 요소에 대한 기본 템플릿 :

  • 는 "복제"여는 태그와 닫는 태그하지 않는, 그냥 텍스트 노드를 포함하여 자녀에 템플릿을 적용
  • .

ID 템플릿을 포함하여이 설정을 덮어 써야합니다.

+0

감사합니다. 이제 작동합니다. ID 템플릿이 무엇인지 모르고 링크 된 질문의 코드에서 제거했습니다. – GRB